0

私の 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 フラグを使用していません。

4

1 に答える 1

1

raiseプロセスではなく、呼び出しスレッドに対してシグナルを発生させます。プロセス全体にシグナルを送信する場合 (シグナルがマスクされていないランダムなスレッドに配信する場合)、kill関数が必要です。特定のスレッドにシグナルを送りたい場合は、pthread_kill.

于 2013-01-12T03:42:47.830 に答える