C 0x Tanpa Semaphore: Mencapai Penyegerakan Benang
C 0x memperkenalkan pelbagai peningkatan, tetapi satu peninggalan yang ketara ialah kemasukan semafor. Semaphore adalah penting untuk penyegerakan utas, membolehkan utas menandakan peristiwa dan menunggu penyelesaiannya.
Pernyataan Masalah
Jika tiada semafor, bagaimana kita boleh melaksanakan mekanisme untuk penyegerakan benang seperti yang ditunjukkan dalam semafor POSIX berikut penggunaan:
void thread0(...) { doSomething0(); event1.wait(); ... } void thread1(...) { doSomething1(); event1.post(); ... }
Penyelesaian Menggunakan Mutex dan Pembolehubah Keadaan
Satu kaedah yang berkesan ialah mencipta kefungsian seperti semaphore menggunakan mutex dan pembolehubah keadaan. Berikut ialah kodnya:
#include <mutex> #include <condition_variable> class semaphore { std::mutex mutex_; std::condition_variable condition_; unsigned long count_ = 0; // Initialized as locked. public: void release() { std::lock_guard<decltype(mutex_)> lock(mutex_); ++count_; condition_.notify_one(); } void acquire() { std::unique_lock<decltype(mutex_)> lock(mutex_); while(!count_) // Handle spurious wake-ups. condition_.wait(lock); --count_; } bool try_acquire() { std::lock_guard<decltype(mutex_)> lock(mutex_); if(count_) { --count_; return true; } return false; } };
Penggunaan
Semafor tersuai ini boleh digunakan dengan cara berikut:
semaphore event1; void thread0(...) { doSomething0(); event1.acquire(); ... } void thread1(...) { doSomething1(); event1.release(); ... }
Berbanding kepada Mutex Sahaja
Pendekatan ini menawarkan beberapa kelebihan berbanding menggunakan mutex sahaja:
Dengan menggunakan pelaksanaan semaphore tersuai ini, anda boleh mencapai penyegerakan thread dengan berkesan dalam C 0x tanpa sokongan semaphore yang jelas.
Atas ialah kandungan terperinci Bagaimanakah Penyegerakan Benang Boleh Dicapai dalam C 0x Tanpa Menggunakan Semaphore?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!