C++11 實現信號量Semaphore類
阿新 • • 發佈:2017-12-03
signed clas 可能 details 時有 art one http spa
1 #pragma once 2 #include <mutex> 3 #include <condition_variable> 4 class Semaphore 5 { 6 public: 7 explicit Semaphore(unsigned int count); //用無符號數表示信號量資源 8 ~Semaphore(); 9 public: 10 void wait(); 11 void signal(); 12 private: 13 int m_count; //計數器必須是有符號數 14 std::mutex m_mutex;15 std::condition_variable m_condition_variable; 16 };
#include "Semaphore.h" Semaphore::Semaphore(unsigned int count):m_count(count) { } Semaphore::~Semaphore() { } void Semaphore::wait() { std::unique_lock<std::mutex> unique_lock(m_mutex); --m_count; while (m_count < 0) { m_condition_variable.wait(unique_lock); } } void Semaphore::signal() { std::lock_guard<std::mutex> lg(m_mutex); if (++m_count < 1) { m_condition_variable.notify_one(); } } //解析: //if (++m_count < 1) 說明m_count在++之前<0,而m_count的初始值,也即信號量的值為無符號數,只可能>=0。//那麽<0的情況也只可能是因為先調用了wait。因此,便可以確定此時有線程在等待,故可以調用notify_one了。
本文參考了http://blog.csdn.net/zdarks/article/details/46994767的代碼,並作出適當修改。
C++11 實現信號量Semaphore類