2

これに対する答えやチュートリアルがないとは信じがたいですが、どこにも見つけるのに苦労しています!

CでGETリクエストを処理するためにマルチスレッドサーバーを構築する必要があります(そして構築しなければなりません)。満点を得るには、スレッドプールを使用する必要があります。現在、私のメインスレッドは接続を受け入れ、それらを新しいスレッドに渡します。

オンラインで c のスレッド プールの実装をいくつか見つけることができますが、Java のバックグラウンドを持っているため、それらを理解するのは難しいことがわかっています。また、それらはすべてタスク キューを使用しているようです。

listen 呼び出しにキュー接続を指示できることを考えると、これは不要に思えます。私はどこかでacceptがスレッドセーフであることを見ました(POSIXが安全だと言っているのも聞くと言っていますか?)これは賢明なアプローチですか?または、接続が渡されるまで実行を停止するのではなく、各スレッドが受け入れを待機することでオーバーヘッドが高くなりますか?

その場合、Cでこれを行うにはどうすればよいですか? 各スレッドへのポインターと、それらがビジーかどうかを示す値を格納するスレッドセーフなデータ構造を保持する必要があると思いますか? スレッドを再起動して接続を渡す方法はありますか? しかし、これを行う方法がわからず、インターネット上で簡単なチュートリアルを見つけることができません。

アドバイスやチュートリアルへのリンクをいただければ幸いです。

ありがとう

4

1 に答える 1

2

Accept()スレッドセーフです。

実際、あなたが説明しているのは、スレッドプールを使用してソケットサーバーを実装するエレガントな方法accept()です。それらすべてを呼び出すと、オペレーティングシステムは、接続が到着したときに1つのスレッドのみを起動します。よくできました。そのようなことを実装しなければならなかったとき、私はこのオプションについて本当に考えたことはありませんでした。

私が見る限りaccept()、複数のスレッドを同時に呼び出しても実際のオーバーヘッドはありません。すべてのスレッドは接続が受け入れられるまでスリープするため、CPU 時間を効果的に消費することはありません。

于 2013-02-24T11:33:45.323 に答える