沒有信號量的C 0x:實現線程同步
C 0x 引入了各種增強功能,但一個值得注意的遺漏是包含信號量。信號量對於線程同步至關重要,它使線程能夠發出事件信號並等待其完成。
問題陳述
在沒有信號量的情況下,我們如何實現一種機制用於線程同步,如下例所示 POSIX信號量用法:
void thread0(...) { doSomething0(); event1.wait(); ... } void thread1(...) { doSomething1(); event1.post(); ... }
使用互斥體和條件變數的解決方案
一種有效的方法是使用互斥體和條件變數建立類似信號量的功能。代碼如下:
#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; } };
用法
此自訂訊號量可以用以下方式使用:
semaphore event1; void thread0(...) { doSomething0(); event1.acquire(); ... } void thread1(...) { doSomething1(); event1.release(); ... }
比較只有互斥
這種方法與單獨使用互斥體相比,它具有以下幾個優點:以上是C 0x中如何在不使用信號量的情況下實現線程同步?的詳細內容。更多資訊請關注PHP中文網其他相關文章!