8

私は座ってApacheのMPMprefork.cを読みました。このコードは、accept_mutex複数のスレッドがを呼び出さないようにするために呼び出される変数を使用していますaccept()。私の知る限り、accept()スレッドセーフであるため、これは奇妙なことです。

accept()スレッドは安全ですか?これはプラットフォームの互換性の問題ですか?もしそうなら、どのプラットフォームが非スレッドセーフを実装していますaccept()か?

4

2 に答える 2

6

これは、Apacheパフォーマンスチューニングのドキュメントの「accept()シリアル化-複数のソケット」で説明されています。簡単に言うと、少なくとも一部のオペレーティングシステムでは、着信接続は、またはで着信接続を待機しているすべてのApacheプロセスをウェイクアップしますが、1つを除くすべてのプロセスで失敗します。これは非効率的であるため、ミューテックスを使用して、一度に1つのプロセスのみが着信接続を受け入れるようにします。select()poll()accept()

于 2013-02-24T04:50:46.737 に答える
2

リンクしたソースのコメントを読んでください。ミューテックスは実際にはaccept操作を保護していないようですが、ポーリングする必要のあるリスニングソケットのリスト(少なくとも、accept正常に動作する壊れていないシステムでは、リスニングソケットが1つしかない場合はミューテックスは使用されないことに注意してください) 。これが実行時に変更される可能性がある場合、コードはおそらく正しいです。しかし、私は彼らが無意味なことをしているだけだと感じています。これはApacheなので、高品質または妥当なコードを期待するべきではありません...

于 2013-02-24T04:42:15.863 に答える