Реализация вытесняющих микропотоков с использованием обработчиков сигналов и setjmp/longjmp

Я хочу реализовать микропотоки, совместимые с POSIX, в среде Linux. Основная идея заключается в следующем:

  1. Используя метод, описанный здесь, назначьте новое пространство стека для каждого волокна.
  2. Используя setitimer, создайте таймер, который будет отправлять сигналы через постоянный интервал времени. Обработчик сигналов для этого таймера будет действовать как планировщик и переключаться между волокнами.

Проблема в том, что выполнение longjmp в обработчике сигналов не завершит обработчик, поэтому ядро ​​​​будет ждать его завершения вместо доставки новых сигналов. Это делает переключение контекстов невозможным, потому что нет сигналов для инициации переключения. Одним из решений было бы разблокировать SIGALRM, поэтому обработчик может выполняться одновременно многими сигналами, но это вызовет проблемы с условиями гонки.

Каков наилучший и самый простой способ реализации вытесняющих микропотоков? Все примеры, которые я нашел в Google, не были упреждающими.


person monkey    schedule 16.01.2010    source источник
comment
Я не понимаю, как ты собираешься этого добиться. Почему вы хотите?   -  person Dark Falcon    schedule 16.01.2010


Ответы (1)


Решение состоит в том, чтобы использовать sigsetjmp/siglongjmp вместо setjmp/longjmp. версии sig* сохраняют маски сигналов :)

person monkey    schedule 03.02.2010