3

Linux環境でPOSIX準拠のマイクロスレッドを実装したいと思います。基本的な考え方は次のとおりです。

  1. ここで説明する手法を使用して、各ファイバーに新しいスタックスペースを割り当てます。
  2. setitimerを使用して、一定の時間間隔で信号を送信するタイマーを作成します。このタイマーのシグナルハンドラーは、スケジューラーとして機能し、ファイバーを切り替えます。

問題は、シグナルハンドラーでlongjmpを実行してもハンドラーが終了しないため、カーネルは新しいシグナルを配信する代わりに、ハンドラーの終了を待機することです。これにより、切り替えを開始する信号がないため、コンテキストの切り替えが不可能になります。1つの解決策は、SIGALRMのブロックを解除することです。これにより、多くのシグナルが同時にハンドラーを実行できますが、これにより競合状態の問題が発生します。

プリエンプティブマイクロスレッドを実装するための最良かつ最も簡単な方法は何ですか?私がGoogleで見つけたすべての例は、先制的ではありませんでした。

4

1 に答える 1

3

解決策は、setjmp/longjmpの代わりにsigsetjmp/siglongjmpを使用することです。sig*バージョンはシグナルマスクを保持します:)

于 2010-02-03T11:48:35.413 に答える