3

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

  1. 使用此处描述的技术,为每根光纤分配新的堆栈空间。
  2. 使用 setitimer,创建将在恒定时间间隔内发送信号的计时器。此计时器的信号处理程序将充当调度程序并在光纤之间切换。

问题是,在信号处理程序中执行 longjmp 不会终止处理程序,因此内核将等待它的终止,而不是传递新信号。这使得切换上下文变得不可能,因为没有信号可以启动切换。一种解决方案是取消阻塞 SIGALRM,这样许多信号可以同时执行处理程序,但这会导致竞争条件问题。

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

4

1 回答 1

3

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

于 2010-02-03T11:48:35.413 回答