9

私はあまり経験がありませんboost::asio。かなり基本的な質問があります。

スレッド化されたサーバーでクライアントを処理するには、別io_serviceの、および別socketthread1つの単一のサーバーを使用する必要がありますか?acceptor

新しいクライアント用に別のソケットが必要だと思います。しかし、すべてのスレッドが同じものio_serviceを使用する場合、それは並列になりますか?

asioセクションのhttp://en.highscore.de/cpp/boost/index.htmlを調べていましたが、並列化を実現するには、さまざまなスレッドにさまざまなio_servicesが必要であると書かれています。

new TCPsession新しいクライアントが表示されるたびに作成するServerクラスを作成しacceptor.async_accept
TCPSessionctorがとを作成しio_serviceてそれを独自のスレッドでthread実行する場合、それは良い設計でしょうか?io_service.run()

ただし、この設計では、これらすべてのスレッドをどこで結合しますか?新しいクライアントを取得する前でも終了しないように、別io_serviceのものが必要ですか?main

4

1 に答える 1

10

単一スレッドで単一io_service実行すると、プロジェクト内のすべての asio オブジェクトを処理できます。このような設計では、I/O はノンブロッキングで非同期であるという意味で「並列」のままです。ただし、io_service::run()は 1 つのスレッドで実行されるため、すべての完了ハンドラが 1 つずつ順番に呼び出されます。

ネットワーキングモジュールを複数の CPU に拡張するには、次の 2 つのアプローチのいずれかを使用できます。

いずれにせよ、スレッドまたはio_serviceperを作成することTCPSessionは、私には不必要なオーバーヘッドのように思えます。何千もTCPSessionのスレッドがある場合を考えてみてください...

于 2012-06-13T08:37:17.280 に答える