Цитата Сообщение от shurik-ua Посмотреть сообщение
есть инфа на русском про эти самые файберы ?
Файберы (Fiber) - это нечто, похожее на потоки (Threads), но в некоторых ОС, таких как Win32, допускается исполнение (неодновременное) нескольких файберов в одном потоке. Отсюда происходит и термин. Thread - нить, а Fiber - волокно, т.е. боле мелкая, составляющая часть нити.

Каждый файбер имеет свой стек, как и поток. Но переключение между файберами происходит только вручную. Есть функция, например Win32 SwitchToFiber(HANDLE), которая переключает исполнение на заданный файбер. При этом состояние текущего файбера (стек) сохраняется. Когда другой файбер сам вызовет SwitchToFiber() на исходный файбер - то исполнение первого файбера будет продолжено.

Файберами нельзя полноценно заменить потоки. Однако меня долгое время интересовало, зачем они вообще нужны и что интересного можно сделать с их помощью. В комментариях на хабре как раз приведены ссылки. Основное применение и структура файберов обычно выглядит так:

... code ...
... call some_function ...
... code ...

При этом функция some_function где-то внутри себя вызывает SwitchToFiber, переключая исполнение на другой файбер, и когда другой файбер отдаст управление назад - функция some_function делает какие-то завершающие действия и возвращается.

Такая модель удобна, например, при проходе по файлу, организованному блочно, например .avi-файлу, где блоки звука перемежаются с блоками видео. Тогда можно сделать два файбера, один из которых обрабатывал бы только звук, а другой - только видео. В функции some_function следует разместить код чтения из входного файла, и в случае нахождения блока, принадлежащего "чужому" файберу - переключить исполнение на него.

---------- Post added at 19:19 ---------- Previous post was at 19:05 ----------

Цитата Сообщение от Alex/AT Посмотреть сообщение
На самом деле - не проще взять на развитие мой scheduler_g2? ( http://zx-pk.ru/showthread.php?t=21281 )
Спасибо, я поизучаю твой проект. Не знал о его существовании. Ну и в любом случае я делал бы свой, т.к. хотелось поупражняться в этом деле

---------- Post added at 19:24 ---------- Previous post was at 19:19 ----------

Цитата Сообщение от Alex/AT Посмотреть сообщение
Треды - вытесняющая модель, файберы - кооперативная.
С этим согласен полностью.
Цитата Сообщение от Alex/AT Посмотреть сообщение
Но по сути на ZX реально применимы только файберы - частота единственно имеющегося прерывания от таймера для вытесняющей модели крайне мала , а большинству задач надо успеть в один и тот же экран выполниться.
А вот с этим категорически не согласен. При чем тут вообще прерывания от таймера к модели многозадачности? Вытесняющую многозадачность можно реализовать и вовсе без прерываний. Я думаю, дело в том, что многие заблуждаются насчет вытесняющей многозадачности в том, что будто бы ее основная идея - быстрое переключение между потоками (Round Robin), чтобы обеспечить их псевдопараллельное исполнение. Нет, на самом деле это тоже можно сделать, но вытесняющая многозадачность - это более широкое понятие, чем Round-Robin.

В том диспетчере, который я опубликовал, вообще отсутствует упомянутое переключение по таймеру. Мои потоки переключаются только тогда, когда происходят события, требующие переключения потоков. Эти события могут происходить и по таймеру, и генерироваться внутри потоков, поэтому переключения потоков могут происходить как чаще, чем частота прерываний, так и реже. И вообще, чем реже - тем лучше, т.к. на переключение расходуется процессорное время.