高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A QA1184
Signals and Threads


Q: Mac OS X でマルチスレッドプロセスを使用しています。プロセスがシグナルを受信した場合、どのスレッドがシグナルハンドラを実行するのでしょうか?

A: スレッド自身によって発生した同期シグナル(SIGPIPESIGBUS など)は、これを発生させたスレッドに配送されます。非同期シグナル(外部ソースによってプロセスに送信されたシグナル)は、プロセス内の任意のスレッドに配送されます。

重要:
現時点では、Mac OS X は次の基準で同期シグナルハンドラを実行するスレッドを選択しています。

  • スレッドがまだ実行している(つまり終了していない)
  • Mac OS X 10.2 以降のバージョンでは、(pthread_sigmask を使用して)スレッドがシグナルをマスクしていない
  • より古いスレッドが新しいスレッドよりも優先する

つまり非同期シグナルは、シグナルをマスクしていないスレッドのうち、最も古く、終了していないスレッドに送信されます。ただし必ずこのように振る舞うと想定しないでください。(下記の pthread_kill を除き)非同期シグナルの処理にこのスレッドが選ばれるということは保証されているわけではなく、将来のシステムでは変更される可能性もあります。

Q: Mac OS X でマルチスレッドプロセスを使用しています。あるスレッドがシグナルを受信した場合、残りのスレッドは停止するのでしょうか?

A: いいえ。残りのスレッドは、シグナルハンドラが呼び出されている間も実行を続けます。

Q: Mac OS X 10.2 ではスレッドによるシグナルの処理に何か変更はありますか?

A: 上記の回答がそのまま有効です。Mac OS X 10.2 におけるスレッドのシグナル処理に関する最も大きな変更は、プロセス内の特定のスレッドへの非同期シグナルの送信(pthread_kill)、スレッドごとのシグナルマスクの設定(pthread_sigmask)、特定のシグナルの待機(sigwait)が可能になったことです。

Q: スレッドの 1 つが sigwait で待ち状態になっている場合、それが非同期シグナルハンドラが実行されるスレッドであるということは保証されますか?

A: いいえ。非同期シグナルハンドラを実行するスレッドの選択については上で説明したとおりであり、sigwait の呼び出しの影響を受けません。これは POSIX 標準に従っています。特定のスレッドが非同期シグナルを処理することを保証する唯一の方法は、他のすべてのスレッドでシグナルをマスクすることです。


[2002 年 8 月 27 日]