Я хочу реализовать микропотоки, совместимые с POSIX, в среде Linux. Основная идея заключается в следующем:
- Используя метод, описанный здесь, назначьте новое пространство стека для каждого волокна.
- Используя setitimer, создайте таймер, который будет отправлять сигналы через постоянный интервал времени. Обработчик сигналов для этого таймера будет действовать как планировщик и переключаться между волокнами.
Проблема в том, что выполнение longjmp в обработчике сигналов не завершит обработчик, поэтому ядро будет ждать его завершения вместо доставки новых сигналов. Это делает переключение контекстов невозможным, потому что нет сигналов для инициации переключения. Одним из решений было бы разблокировать SIGALRM, поэтому обработчик может выполняться одновременно многими сигналами, но это вызовет проблемы с условиями гонки.
Каков наилучший и самый простой способ реализации вытесняющих микропотоков? Все примеры, которые я нашел в Google, не были упреждающими.