沒有信號量的 C 0x 中的同步
C 0x 引入了原子變量和條件,但缺乏顯式信號量支持。這引發了人們對如何在不使用 Boost 信號量實現的情況下有效同步執行緒的擔憂。
一種方法涉及利用互斥體和條件變數的組合來建立自訂訊號量。考慮以下範例:
#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; } };
此實作利用互斥體 (mutex_) 來保護對內部資料的訪問,並在釋放信號量時使用條件變數 (condition_) 向等待執行緒發出訊號。 count_ 成員變數初始化為零,表示初始鎖定狀態。
要釋放信號量(即使其可用於獲取),release() 方法會增加計數並通知任何等待線程。要取得信號量,acquire() 方法將等待計數非零。 try_acquire() 方法嘗試非阻塞地取得信號量,如果成功則傳回 true,否則傳回 false。
這種方法提供了一種簡單而有效的方法來在 C 0x 中實現信號量,而無需使用 Boost。它的功能與 POSIX 信號量類似,允許線程同步其執行並有效地傳達事件。
以上是如何在不使用 Boost 的情況下在 C 0x 中實現信號量?的詳細內容。更多資訊請關注PHP中文網其他相關文章!