関数でalarm
UDP再送を実装したい。この関数はスレッドセーフですか? マルチスレッド環境で動作しますか。
3 に答える
スレッドで呼び出しても保留中のシグナルはリセットされないため、おそらくスレッドでalarm()
呼び出したくないでしょう。基礎となる機能がpthreadsである場合、使用している言語に関係なく、親内でのみ呼び出したいでしょう。
おそらく、必要に応じてデータを再送信するためにスレッドと共有される構造にプロビジョニングを作成するか、実行中のスレッドのすべて (または一部) を突き刺して、親でシグナルを処理したときに再送信する方がよいでしょう。
スレッド内で呼び出すのが良いアイデアである実装は考えられないので、いいえ-そのようには使用しません。
alarm() 関数はスレッドセーフではありません。
プロセスレベルだから。タイマーがトリガーされると、どのスレッドがシグナルを受信するかを制御することはできません。そのため、シグナルの到着時に、別のスレッドが実行されている可能性があります。SIG_SEGV でプログラムをクラッシュさせることがあります。
ドキュメント によると、alarm
「プロセスレベル」であり、最後の呼び出しのみがアクティブです... SIGNALモデルを使用し、非同期SIGALARAMをプロセスに送信します...呼び出されたシグナルハンドラーがスレッドセーフであるかどうかは、実装によって異なります...