google-code-prettify

2008-12-26

スレッドを確実にsuspendする

Solarisのスレッドには、thr_suspend()という関数がある。この関数は、
他のスレッドをsuspendし、thr_suspend()からリターンした時には、ターゲットとなるスレッドが停止している事が保証されている。
という関数である。

pthreadでスレッドAから別のスレッドBをsuspendするには、
pthread_kill(B, SIGSTOP)
を使えば良いのだが、pthread_killからリターンした時点では、スレッドBは停止していない可能性がある。

pthreadでthr_suspend()と同じ機能を実現しようと思ったら、以下のようにすると良い。

1. スレッドBのSIGUSR1のシグナルハンドラを登録しておく。
2. スレッドAは、pthread_kill(B, SIGUSR1)をする。
3. スレッドAは、sem_wait()でセマフォ待ちをする。
4. スレッドBのSIGUSR1のシグナルハンドラで、sem_post()して、スレッドAを起こす。

ポイントは、4。
シグナルハンドラからは非同期シグナルセーフ関数しか呼んではいけないが、sem_post()は非同期シグナルセーフ関数なので、スレッド間の同期を取るのに使う事ができる。

参考:

0 件のコメント: