Dalam senario memori dikongsi dengan berbilang proses dan penimbal bulat yang besar, mencapai penyegerakan yang berkesan menimbulkan cabaran. Artikel ini meneroka pendekatan tanpa kunci menggunakan Boost Interprocess dan Boost Lockfree untuk menangani isu ini.
Boost Interprocess menyediakan sokongan untuk memori dikongsi, manakala Boost Lockfree menawarkan pengeluar- pelaksanaan baris gilir pengguna (spsc_queue). Baris gilir ini serupa dengan penimbal bulat.
Pertimbangkan contoh berikut menggunakan Boost Interprocess dan 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>
Ini mentakrifkan jenis rentetan kongsi yang memperuntukkan memori daripada segmen kongsi dan penimbal cincin kongsi dengan kapasiti 200 elemen.
<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>
Pengguna sentiasa memantau baris gilir kongsi untuk mesej dan memprosesnya dengan selang tidur 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>
Pengeluar menghantar tiga mesej ke baris gilir kongsi dengan selang 250ms.
Dengan menggunakan spsc_queue Boost Lockfree, pengeluar dan pengguna boleh berkomunikasi tanpa mekanisme penguncian. Pelaksanaan baris gilir memastikan bahawa penulisan kepada penimbal dapat dilihat dengan serta-merta kepada pengguna, menyelesaikan isu keterlihatan yang dihadapi dengan halangan pengkompil menggunakan GCC.
Atas ialah kandungan terperinci Bagaimanakah Boost Interprocess dan Lockfree boleh digunakan untuk mencapai penyegerakan tanpa kunci dalam senario memori dikongsi dengan penimbal bulat yang besar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!