여러 프로세스와 대규모 순환 버퍼가 있는 공유 메모리 시나리오에서는 효과적인 동기화를 달성하는 것이 어렵습니다. 이 기사에서는 이 문제를 해결하기 위해 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>
소비자는 공유 대기열에서 메시지를 지속적으로 모니터링하고 대기 간격은 10ms입니다.
<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>
생산자는 250ms 간격으로 공유 대기열에 3개의 메시지를 보냅니다.
Boost Lockfree의 spsc_queue를 활용하면 생산자와 소비자가 잠금 메커니즘 없이 통신할 수 있습니다. 대기열 구현은 버퍼에 대한 쓰기가 소비자에게 즉시 표시되도록 보장하여 GCC를 사용하여 컴파일러 장벽으로 인해 발생하는 가시성 문제를 해결합니다.
위 내용은 대규모 순환 버퍼가 있는 공유 메모리 시나리오에서 Boost Interprocess 및 Lockfree를 사용하여 잠금 없는 동기화를 달성하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!