マルチスレッドブロードキャストチャットサーバーをc++で実装する必要があります(学校のプロジェクト用)。非同期ソケットを使用できず、Win32でC ++で記述しています(ブーストベースのソリューションで問題ありません)。
私の設計は非常に単純でわかりやすいものにする必要があります。「メイン」スレッドは着信接続を待機し、新しい接続が到着すると、クライアントからのメッセージを読み取るためにスレッドプール(レガシーAPI)の(新しい)スレッドに渡します。
ここで最初の問題が発生します。(A)クライアントに書き込むためにソケットを別の(新しい)スレッドに渡す必要がありますか?または(B)読み取り/書き込みに同じスレッドを使用する必要がありますか?または(C)すべてのクライアントへの書き込みに一意のスレッドを使用する必要がありますか?(繰り返しますが、同期して)。
ソリューションAまたはBを使用する場合、クライアントからメッセージが到着すると、接続されている他のすべてのクライアントにメッセージがディスパッチされる必要があります。単一の(共有)変数にメッセージを配置し、同期構造を使用してすべてのスレッドでメッセージを待機する必要があります。 ?リーダー/ライター+バリア(動的サイズ)のようなものになるはずですが、私はこれをうまく解決できませんでした。
一方、ソリューションCを使用する場合は、「socket」のコレクション(st::list
「socket」など)または「subscriberobject」のコレクションなどを何らかの方法で反復処理する必要があります。その場合、私の主な関心事は、収集からのキャンセルをどのように管理するか(そしてもちろん、それからの並列読み取り)についてです。考えられる解決策は、コレクション全体を同じミューテックスでロックすることです。しかし、うまく機能するとは思いません。
もちろん、私のために問題を解決してほしくないのですが、私の問題に合うパターンや同様の問題の解決策を指摘していただければ完璧です。(とにかく、ここでの主な問題は放送です!)
ありがとう