使用信号处理程序和setjmp / longjmp实现抢占式微线程

时间:2010-01-16 15:52:38

标签: longjmp fibers

我想在Linux环境中实现符合POSIX标准的微线程。基本思路如下:

  1. 使用描述here的技术,为每根光纤分配新的堆栈空间。
  2. 使用setitimer,创建将以恒定时间间隔发送信号的计时器。此计时器的信号处理程序将充当调度程序并在光纤之间切换。
  3. 问题是,在信号处理程序中执行longjmp不会终止处理程序,因此内核将等待它的终止,而不是传递新信号。这使得切换上下文不可能,因为没有信号来启动交换机。 一种解决方案是解锁SIGALRM,因此许多信号可以同时执行处理程序,但这会导致竞争条件问题。

    实施抢先式微线程的最佳和最简单的方法是什么?我在Google上找到的所有示例都不是先发制人的。

1 个答案:

答案 0 :(得分:3)

解决方案是使用sigsetjmp / siglongjmp,而不是setjmp / longjmp。 sig *版本保留信号掩码:)