LINUX.ORG.RU

История изменений

Исправление 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, но контролировать пользователь его не может.

Хотелось уточнить, правильно ли я это понял.