0

unistdc関数で次のことができるかどうか知りたいですalarm(int signal)

私のメインを持っている....そして各スレッドの帽子は、関数でSIGALRMを初期化するために作成されます。これは、アクティブ化した場合に私のスレッドを閉じる必要があります。これは可能ですか?または1SIGALRM/ mainは合法のみですか?

4

2 に答える 2

2

OK、最初に、alarm()は実際には、有効期限が切れるまでの秒数であるunsignedint値を取得しています。したがって、あなたの例は、FYIint signalの正しい実装ではありません。alarm()

これに関する限り:

for each thread that is created to initialization a SIGALRM
SIGALRM生成されるのはスレッドごとではなくプロセスに対して行われるため 、アラームをキャッチし、どのスレッドに対して発生したかを把握し、それに応じて処理するための内部戦略を立てる必要があります。ハンドラーを取得したら、アラームを何度も発生させることができますが、次の点に注意してください。

アラーム要求はスタックされません。

したがって、これは一度に1つずつ実行する必要があります。それはまだ可能ですが、あなたが望んでいたように完全に前向きではありません。

私が話していることの非常に大まかな例については:

  • リクエストを追跡する「マネージャー」がいます
  • スレッド1は、マネージャーに10秒以内に何かを処理する必要があることを通知します
  • マネージャーはこれを「記録」し、セットを呼び出しますalarm(10)
  • スレッド2は、3秒以内にウェイクアップする必要があることをマネージャーに通知します
  • マネージャーはalarm(0)アラームを強制終了するために呼び出し、呼び出し、そしてそれが鳴ったらスレッド1のスリープ時間を終了alarm(3)するために呼び出す必要があることに注意しますalarm(7)
  • アラームハンドラーでは、マネージャーに電話して、アラームが鳴ったことを通知すると、適切なスレッド(2)が起動し、次のスレッドのアラームがリセットされます。
于 2013-03-18T16:58:57.690 に答える
2

プロセス内の各スレッドには、スレッドが現在ブロックしているシグナルのセットを示す独立したシグナルマスクがあります。スレッドは、pthread_sigmask(3)を使用してシグナルマスクを操作できます。従来のシングルスレッドアプリケーションでは、sigprocmask(2)を使用してシグナルマスクを操作できます。

男7信号から。

問題は、アラームがスレッドごとではなくプロセスごとに機能することです。そのため、スレッドのシグマスクが同じである場合、どちらがシグナルを受信するかを実際に知ることはできません。

于 2013-03-18T17:11:43.043 に答える