2010-01-16 60 views
3

我想在Linux環境中實現POSIX兼容的微線程。基本思路如下:使用信號處理程序和setjmp/longjmp實現搶佔式微線程

  1. 使用描述的技術here,爲每個光纖分配新的堆棧空間。
  2. 使用setitimer,創建定時器,它將以固定的時間間隔發送信號。此定時器的信號處理程序將充當調度程序並在光纖之間切換。

問題是,在信號處理程序中執行longjmp不會終止處理程序,因此內核將等待它終止,而不是傳遞新信號。這使得交換上下文變得不可能,因爲沒有信號來啓動交換機。 解決方案之一就是解鎖SIGALRM,所以很多信號可以同時執行處理程序,但這會導致競爭條件問題。

實施搶先式微螺紋的最佳和最簡單的方法是什麼?我在Google上找到的所有例子都不是先發制人的。

+0

我不明白你將如何實現這一點。你爲什麼想要? – 2010-01-16 17:26:08

回答

3

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