2012-03-23 28 views
6

APUE 2eの章12.5によると:関数が複数のスレッドに関してリエントラントである場合スレッドの違い安全で非同期シグナル安全

、我々はそれがスレッドセーフであると言います。しかし、シグナルハンドラに関して関数がリエントラントであるかどうかはわかりません。非同期シグナルハンドラから再入力するのが安全な関数は、非同期シグナルセーフです。

私の質問があり

Q1:

"一般的な再入" のコンセプトは、(すべての状況で再entrantcyを意味する)はありますか?存在する場合、マルチスレッドと非同期信号の両方に関してのみリエントラントに等しい一般的なリエントラントは存在するか?あるいは、一般的なリエントラントについて話すときに考慮すべき3番目の条件がありますか?

Q2:

スレッドの安全性は明らかである非同期シグナルの安全性を、意味するものではありません。しかし、非同期信号の安全性は確実にスレッドの安全性を暗示していますか?私はたくさんのグーグルで探そうとしていますが、人々はそれがそうであると言っていますが、私はそれのための情報源を見つけることができません。

Q3:

Q1とQ2の両方への答えがイエスであれば、私は一般的な再入だけで非同期シグナル安全に等しいと思いますか?

答えて

5

Q1:非同期信号の安全は、リエントラントの最も強力な概念です。リソースを慎重に使用する必要があり、クロスプラットフォームのアプリケーションコードでは管理が困難です。

Q2:非同期シグナルセーフは、スレッドセーフであることを意味します。スレッドセーフであるということは、関数を2回呼び出すことはできますが、異なるスレッドから呼び出すことができます。関数の2つの呼び出しが同じスレッド内にある可能性があるため、非同期信号の安全性はより強くなります。ロックを解除する関数の別の呼び出しを待つだけでは不十分なので、シグナルハンドラ内の2番目の呼び出しは、共有リソースが不整合な状態にあっても最初の呼び出しを中断できなければなりませんその後、終了時に復元します。シグナルハンドラからの共有リソース/状態を使用することは基本的に不可能です。シグナルハンドラの仕組みを本当に知っていて、狂気のコードを書くためのあいまいな理由がある場合を除き、常に「自己パイプ技法」を使用します。

Q3:スレッドセーフであることを意味するのにリエントラントを使用する人もいます。 Unixシグナルハンドラは、より強力なものが必要とされる唯一の一般的な場所です。そこに何か巧妙なことをしようとしてはいけないので、少し不明です。

+0

この例が見つかりました:https://en.wikipedia.org/wiki/Reentrancy_(computing)wikiの2番目のスワップ関数を参照してください。これは非同期シグナル安全ですが、スレッドセーフではありません。だから、私は非同期シグナル安全はスレッドセーフではないと思う。 – PickBoy

+0

良い点は、反例です!かなり工夫された。 –