プロデューサーとコンシューマー (「クライアント」) がブロードキャスト メッセージを相互に送信したい、つまりn:m
関係があるアプリケーションがあります。すべてが異なるプログラムである可能性があるため、それらは異なるプロセスであり、スレッドではありません。
より保守しやすいものに減らすためにn:m
、小さな中央サーバーを導入するようなセットアップを考えていました。そのサーバーは、各クライアントが接続するソケットを提供します。
そして、各クライアントはそのソケットを介してサーバーに新しいメッセージを送信し、1:n
.
サーバーは、クライアントに対して読み取り専用の共有メモリも提供します。これは、サーバーによって新しいメッセージが追加され、古いメッセージが上書きされるリング バッファーとして編成されます。
これにより、クライアントがメッセージを処理する時間が与えられますが、遅すぎる場合は不運であり、いずれにせよ関係がなくなります...
このアプローチの利点は、同期だけでなく、不要なデータのコピーやバッファ階層を回避できることです。中心的なもので十分なのではないでしょうか?
それがこれまでのアーキテクチャです - 理にかなっているといいのですが...
次に、それを実装することのより興味深い側面について説明します。
リング バッファー内の最新の要素のインデックスは共有メモリ内の変数であり、クライアントはそれが変更されるまで待つ必要があります。愚かなのではなくwhile( central_index == my_last_processed_index ) { /* do nothing */ }
、たとえばを使用してCPUリソースを解放したいpthread_cond_wait()
.
しかし、それには必要ないと思うミューテックスが必要です-一方で、なぜpthreadの条件変数関数にはミューテックスが必要なのですか? 私のアーキテクチャが理にかなっており、そのように実装できるかどうかを尋ねたほうがよいという印象を受けました...
それがすべて理にかなっており、うまくいくかどうか、ヒントを教えてもらえますか?
(補足: クライアント プログラムは、Perl や Python などの一般的なスクリプト言語で作成することもできます。そのため、サーバーとの通信はそこで再作成する必要があるため、複雑すぎたり、独自のものであってはなりません)