私の FreeBSD9 のコピーでは、sempahore.h の sem_wait の man ページに EINTR エラーの戻り値がないことに気付きました。現在、シグナル ハンドラを持つコードがいくつかあり、SIGINT シグナルを発生させています。これは sem_wait() を起こしているようには見えないので、戻り値を確認できます。そのため、sem_wait を使用して関数を実行しているスレッドが無期限にハングします。
Linux のマニュアル ページによると、sem_wait を実行しているスレッドでシグナルを発生させ、EINTR 値をテストできるはずですが、FreeBSD にはそれがないようです。
これを修正する正しい方法は何ですか?
擬似的にここに私が持っているものがあります
signal_handler() //handles SIGINT
{
loopvar = 0;
}
スレッド 1:
while(loopvar)
{
if((r = sem_wait())
{
check error value
continue
}
..
sem_post()
}
スレッド 2:
raise(SIGINT);
そのため、thread2 が SIGINT を発生させたときに sem_wait が値を返し、ループが続行されることを期待していましたが、loopvar がゼロになるため、無限ループを終了します。
編集:明確にするために、私は SA_RESTART フラグを使用していません。