マルチスレッドで C++ で記述された Linux サーバー アプリケーションを保守しています。約 10 個のモジュールがあり、メッセージを渡す目的でそこに数十個の std::deques があります。アプリケーションは Producer-Consumer パターンを使用して、モジュール間でネットワーク パケットを渡します。
Producer-Consumer デザイン パターンは多くの状況でうまく機能しますが、私たちのアプリケーションには適していないと思います。以下の疑似コードのフロー チャットを参照してください。
CSocketModule (for receiving and sending packets)
CSockMod::ReceivePackWorkerThread --> CSockMod::Inque -->
CSockMod::InqueWorkerThread --> CSomeMod::Inque -->
CSomeMod::InqueWorkerThread --> Generates Response Packets -->
CSomeMod::Outque --> CSomeMod::OutqueWorkThread --> //Optional
CSockMod::Outque --> CSockMod::SendPackWorkerThread -->
Linux Kernel::TCP/UDP Layer
For each module, there would be two std::deques for buffering
in/out pakets, two working threads for processing incoming and
outgoing packets respectively.
ほとんどすべての Inque と Outque は、実行時に 3 つ以上のスレッドによってアクセスされるため、これらのキューを同期するには、多くの pthread_mutex_locks が必要です。ただし、これらのロックにより、アプリケーションはシングル スレッド ソフトウェアのように動作します。サーバー アプリケーションとして、これは受け入れられない可能性があります。
一方、CSomeMod::Inque に 1000 個のパケットがあり、1000 番目のパケットがクライアントからの制御パケットである場合、クライアントは、CSomeMod::InqueWorkerThread が Inque で 999 個のパケットを処理するまで待機する必要があります。コマンドの制御が大幅に遅れる可能性があります。
では、Producer-Consumer パターンは私たちのアプリケーションには適していないのでしょうか? それとも、ここでこのパターンを使用することに誤解がありますか? 助けていただければ幸いです、ありがとう!
スティーブ