есть ли способ реализовать многозадачное использование setjmp
и longjmp
функции
Это может немного изменить правила, но GNU pth делает это. Это возможно, но вам, вероятно, не стоит пробовать это самостоятельно, кроме как в качестве академического упражнения по проверке концепции, используйте реализацию pth, если вы хотите делать это серьезно и удаленно переносимым способом - вы поймете, почему, когда прочтете код создания p-го потока.
(По сути, он использует обработчик сигналов, чтобы обманом заставить ОС создать новый стек, а затем удалить longjmp и сохранить стек. Очевидно, он работает, но чертовски отрывочен.)
В производственном коде, если ваша ОС поддерживает makecontext / swapcontext, используйте их. Если он поддерживает CreateFiber / SwitchToFiber, используйте их. И помните о неутешительной истине, что одно из наиболее убедительных способов использования сопрограмм - то есть инвертирование управления путем выдачи обработчиков событий, вызываемых внешним кодом, - небезопасно, потому что вызывающий модуль должен быть реентерабельным, и вы, как правило, можете Не могу это доказать. Вот почему волокна по-прежнему не поддерживаются в .NET ...