unistdc関数で次のことができるかどうか知りたいですalarm(int signal)
私のメインを持っている....そして各スレッドの帽子は、関数でSIGALRMを初期化するために作成されます。これは、アクティブ化した場合に私のスレッドを閉じる必要があります。これは可能ですか?または1SIGALRM/ mainは合法のみですか?
OK、最初に、alarm()
は実際には、有効期限が切れるまでの秒数であるunsignedint値を取得しています。したがって、あなたの例は、FYIint signal
の正しい実装ではありません。alarm()
これに関する限り:
for each thread that is created to initialization a SIGALRM
SIGALRM
生成されるのはスレッドごとではなくプロセスに対して行われるため
、アラームをキャッチし、どのスレッドに対して発生したかを把握し、それに応じて処理するための内部戦略を立てる必要があります。ハンドラーを取得したら、アラームを何度も発生させることができますが、次の点に注意してください。
アラーム要求はスタックされません。
したがって、これは一度に1つずつ実行する必要があります。それはまだ可能ですが、あなたが望んでいたように完全に前向きではありません。
私が話していることの非常に大まかな例については:
alarm(10)
alarm(0)
アラームを強制終了するために呼び出し、呼び出し、そしてそれが鳴ったらスレッド1のスリープ時間を終了alarm(3)
するために呼び出す必要があることに注意しますalarm(7)
プロセス内の各スレッドには、スレッドが現在ブロックしているシグナルのセットを示す独立したシグナルマスクがあります。スレッドは、pthread_sigmask(3)を使用してシグナルマスクを操作できます。従来のシングルスレッドアプリケーションでは、sigprocmask(2)を使用してシグナルマスクを操作できます。
男7信号から。
問題は、アラームがスレッドごとではなくプロセスごとに機能することです。そのため、スレッドのシグマスクが同じである場合、どちらがシグナルを受信するかを実際に知ることはできません。