現在の実装では、コード内でロックフリー キューを使用して、単一のプロデューサーとコンシューマーの間のロックの競合を減らすことを検討してきました。キューの実装はたくさんありますが、ノードのメモリ管理を最適に管理する方法についてはあまり明確ではありませんでした。
たとえば、プロデューサーは次のようになります。
queue.Add( new WorkUnit(...) );
そして、消費者は次のようになります。
WorkUnit* unit = queue.RemoveFront();
unit->Execute();
delete unit;
現在、メモリ プールを割り当てに使用しています。プロデューサがメモリを割り当て、コンシューマがそれを削除することに気付くでしょう。プールを使用しているため、適切に保護するためにメモリ プールに別のロックを追加する必要があります。これは、そもそもロックフリー キューのパフォーマンス上の利点を無効にしているようです。
これまでのところ、私たちの選択肢は次のとおりだと思います。
- ロックのないメモリ プールを実装します。
- メモリ プールをダンプし、スレッドセーフ アロケータに依存します。
他に検討できるオプションはありますか? ロックフリー メモリ プールの実装を回避しようとしていますが、その道をたどる可能性があります。
ありがとう。