私は、UNIXからWindowsへの比較的単純なネットワークコードの移植に取り組んでいます。
簡単に言うと、すべてのネットワークトラフィックを管理する単一のネットワークスレッドがあります。この単一のスレッドはpoll()
ほとんどの場合内部にあり(Windowsではすでにこれをselect()
に変換しています)、ネットワークスレッドは着信ネットワークデータがある場合にのみウェイクアップします。クライアントコマンドが到着すると、ネットワークスレッドは、バックエンドで実際に作業を実行するためにワーカースレッドにコマンドを起動し、さらに着信コマンドのリッスンに戻ります。コマンドは非同期です。1つのソケットに複数のコマンドを次々と入力できます。いつでも、1つの接続に数十の未処理のコマンドが存在する可能性があり、すべてがさまざまなワーカースレッドで処理されます。
poll()
問題は、ワーカースレッドが応答データを送信しようとしているときに、ワーカースレッドが結果を送信しようとしているときに、ネットワークスレッドが内部でスリープしている可能性があることです。poll()
ネットワークスレッドは、送信するためにキューに入れられた新しいアウトバウンドデータがあることに気付く前に、タイムアウト(または受信される別のパケット)を待つ必要があります。
UNIXでは、監視対象の記述子の中にパイプを含めることでこれに対処しpoll()
ます。ワーカースレッドに送信するアウトバウンドデータがある場合は、パイプに1バイトのデータを書き込んでネットワークスレッドをウェイクアップします。しかし、WinSockはソケットの待機のみをサポートしているように見えるので、そのアプローチはWindowsでは機能しません。WinSockを使用してWindowsでこのアーキテクチャを救済する方法はありますか(異なるプラットフォーム間でほとんどのコードを共有できるようにするため)、またはWindowsで使用するカスタムネットワークサーバー実装を作成する以外に選択肢はありませんか?
アドバイスありがとうございます!