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()は非同期シグナルセーフ関数なので、スレッド間の同期を取るのに使う事ができる。
参考:
Building an open-source Solaris-compatible threads library
0 件のコメント:
コメントを投稿