没有信号量的 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 中有效地实现线程同步,而无需显式信号量支持。
以上是C 0x中如何在不使用信号量的情况下实现线程同步?的详细内容。更多信息请关注PHP中文网其他相关文章!