История изменений
Исправление dissident, (текущая версия) :
Дело в том, что в Unity «не такие корутины». Т.е. yield есть, запускаются они в одном трэде, но контроль не возвращается пользователю. Если создать несколько корутин и в каждой сделать yield, то они просто будут между собой переключаться самостоятельно в одном из методов а-ля Update но не контролируемом пользователем.
Другими словами будет что-то вроде:
do each frame while not game over:
yield from coroutine1
yeidl from coroutine2
...
Update from 1 MonoBehavior
Update from 2 MonoBehavior
...
(не уверен, что порядок именно такой, возможно Update’ы в начале, но работает примерно так).
Т.е. по-моему это все же fibers. Если же прочитать: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4024.pdf, то как раз под определение fiber попадает: нет мутексов, есть yield’ы, но и есть scheduler, нету preemtive multitasking, но есть cooperative multitasking, но контролировать пользователь его не может.
Хотелось уточнить, правильно ли я это понял.
PS
треды, они же нити - контекст переключется шедулером, по таймеру, и может быть переключен в любой точке кода(если не запрешено переключение тем или иным образом), и тут требуется полный набор обьектов синхронизации.
Если верить pdf’у, то не совсем так:
- трэды, они же нити - preemtive multitasking, контекст переключается шедулером, по таймеру или еще как-нибудь в любой точке кода (если не запрещено переключение тем или иным образом), и тут требуется полный набор объектов синхронизации
- fibers, cooperative multitasking, в точках указанных пользователем (yield), но само переключение не контролируется пользователям.
- coroutines, cooperative multitasking - тоже самое, но переключение между yield’ами производится пользователем
Исходная версия dissident, :
Дело в том, что в Unity «не такие корутины». Т.е. yield есть, запускаются они в одном трэде, но контроль не возвращается пользователю. Если создать несколько корутин и в каждой сделать yield, то они просто будут между собой переключаться самостоятельно в одном из методов а-ля Update но не контролируемом пользователем.
Другими словами будет что-то вроде:
do each frame while not game over:
yield from coroutine1
yeidl from coroutine2
...
Update from 1 MonoBehavior
Update from 2 MonoBehavior
...
(не уверен, что порядок именно такой, возможно Update’ы в начале, но работает примерно так).
Т.е. по-моему это все же fibers. Если же прочитать: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4024.pdf, то как раз под определение fiber попадает: нет мутексов, есть yield’ы, но и есть scheduler, нету preemtive multitasking, но есть cooperative multitasking, но контролировать пользователь его не может.
Хотелось уточнить, правильно ли я это понял.