複数のプロセスと大規模な循環バッファを備えた共有メモリのシナリオでは、効果的な同期を達成することが課題となります。この記事では、この問題に対処するために、Boost Interprocess と Boost Lockfree を使用したロックフリーのアプローチについて説明します。
Boost Interprocess は共有メモリのサポートを提供し、Boost Lockfree はプロデューサーを提供します。コンシューマ キューの実装 (spsc_queue)。このキューは循環バッファに似ています。
Boost Interprocess と Lockfree を使用した次の例を考えてみましょう。
<code class="cpp">// Shared Memory Types namespace shm { using shared_string = bip::basic_string<char, std::char_traits<char>, char_alloc>; using ring_buffer = boost::lockfree::spsc_queue< shared_string, boost::lockfree::capacity<200> >; }</code>
これは共有文字列タイプを定義します。共有セグメントからのメモリと、200 要素の容量を持つ共有リング バッファを割り当てます。
<code class="cpp">// Consumer Side int main() { // Open or create shared memory segment bip::managed_shared_memory segment(bip::open_or_create, "MySharedMemory", 65536); // Find or construct shared queue shm::ring_buffer *queue = segment.find_or_construct<shm::ring_buffer>("queue")(); // Infinite loop to process messages while (true) { // Sleep for 10ms std::this_thread::sleep_for(std::chrono::milliseconds(10)); // Allocate shared string to receive message shm::shared_string v(char_alloc); // Pop message from queue if (queue->pop(v)) std::cout << "Processed: '" << v << "'\n"; } }</code>
コンシューマは、メッセージの共有キューを継続的に監視し、それらを10 ミリ秒のスリープ間隔。
<code class="cpp">// Producer Side int main() { // Open or create shared memory segment bip::managed_shared_memory segment(bip::open_or_create, "MySharedMemory", 65536); // Find or construct shared queue shm::ring_buffer *queue = segment.find_or_construct<shm::ring_buffer>("queue")(); // Produce messages for (const char* s : { "hello world", "the answer is 42", "where is your towel" }) { // Sleep for 250ms std::this_thread::sleep_for(std::chrono::milliseconds(250)); // Push message to queue queue->push({s, char_alloc}); } }</code>
プロデューサーは、250 ミリ秒の間隔で 3 つのメッセージを共有キューに送信します。
Boost Lockfree の spsc_queue を利用することで、プロデューサーとコンシューマーはロック機構なしで通信できます。キューの実装により、バッファへの書き込みがコンシューマに即座に表示されるようになり、GCC を使用するコンパイラ バリアで発生する可視性の問題が解決されます。
以上がBoost Interprocess と Lockfree を使用して、大規模な循環バッファーを使用する共有メモリ シナリオでロックフリー同期を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。