Может ли волокно, созданное в потоке A, переключиться на другое волокно, созданное в потоке B? Чтобы сделать вопрос более конкретным, некоторые операционные системы имеют встроенные волокна (окна волокна),
другие должны реализовать это сами (используя setjump longjump в linux и т. д.).
Libcoro например, оборачивает все это в один API (для окон это просто оболочка для собственных волокон, для Linux он сам реализует это и т. д.)
Итак, если есть возможность переносить волокна между потоками, можете ли вы привести пример использования в windows (linux) в c / c ++?
Я нашел кое-что о миграции волокон в библиотеке наддува документация, но это не достаточно конкретно о его реализации и зависимости от платформы. Я все еще хочу понять, как сделать это самостоятельно, используя, например, только windows fiber (или используя Libcoro в linux).
Если это невозможно в общий путь, почему так?
Я понимаю, что волокна предназначены для использования в качестве легкие нити для совместной многозадачности одна нить, они имеют дешевое переключение контекста по сравнению с обычными потоками и упрощают программирование.
Примером использования является система с несколькими потоками, каждый из которых имеет несколько волокон, выполняющих какую-то рабочую иерархию в своем родительском потоке (никогда не покидая родительский поток).
Несмотря на то, что это не предполагаемое использование, я все же хочу узнать, как это сделать, если это возможно в общем виде, потому что я думаю, что могу оптимизировать рабочую нагрузку в моей системе заданий путем миграции волокон между потоками.
Упомянутый boost.fiber использует boost.context (callcc / продолжение) для реализации переключения контекста.
CallCall до 1.64 был реализован только на ассемблере, boost-1.65 позволяет выбирать между ассемблером, Windows Fibers (Windows) или ucontext (POSIX, если доступно; устаревший API от POSIX).
Реализация ассемблера быстрее, чем две другие (на 2 порядка по сравнению с ucontext).
boost.fiber использует callcc для реализации легких потоков / волокон — библиотека предоставляет планировщики волокон, которые позволяют переносить волокна между потоками.
Например, один предоставленный планировщик крадет волокна из других потоков, если его очередь выполнения выходит из строя (волокна, которые готовы / могут быть возобновлены).
(так что вы можете выбрать волокна Windows, которые переносятся между потоками).
Других решений пока нет …