最初に、私がやろうとしていることについて少し説明します。
私の計画は、boost:spirit::qi を使用して実装されたパーサーにデータを供給する、boost::asio ライブラリを使用して実装されたソケット ストリームを持つプログラムを作成することです。パーサーはパケットを受け取り、パケット オブジェクトを埋めてから、そのオブジェクトをパケット オブジェクトのリンク リストの末尾に追加します。パケット プロセッサは、リスト内の最初のオブジェクトを読み取り、その処理を実行してから、次の項目に移動して最初のオブジェクトを削除します。
リンク リストを使用することにしたのは、std::queue を使用した場合、ストリームがパケットを追加するたびに、またはプロセッサがパケットを削除するたびにコンテナー全体をロックする必要があり、2 つのスレッドが多かれ少なかれ連続して実行されるためです。避けたいと思います。さらに、キュー クラスにはオブジェクト全体をコピーする傾向がありますが、リンク リストのアイデアには、オブジェクトを一度作成してからそれを指すだけでよいという利点があります。このビジネス全体のシリアライズを避けるために、boost:mutex ミューテックスを各ノードに配置し、そこからロックするつもりです。アイデアは、ソケット ストリームでリストを作成し、すぐに最初のノードをロックし、パーサーからノードに入力し、次のノードを作成してロックし、最初のノードのロックを解除して次のノードに移動して作業を行うことです。こっちへ」ソケット ストリーム ノーズの下でパケット プロセッサがジャンプして削除する可能性がある、ロックされていないノードが最後にぶら下がることは決してありません。パケット プロセッサは最初のノードをチェックしてロックしようとします。ロックされている場合は、処理を行ってからロックを解除し、次のノードを取得して最初のノードを削除します。このように、シリアライゼーションは、パケット プロセッサがソケット ストリーム クラスに追いついた時点に限定されます。
さて、私の質問は、これを実際に実装する作業を行う前に、これは良いアイデアのように聞こえますか? 簡単なテストで試してみましたが、問題なく動作するようです。例外処理を実装し、割り当てたメモリを解放するように注意している限り、これに関する重大な問題は考えられませんが、誰かが考えられる場合私が見落としていたこのアイデアに関する問題があれば、ご意見をいただければ幸いです。また、代替案として、またはこのアイデアをよりうまく機能させる可能性のある他の提案をいただければ幸いです。
前もって感謝します!