1. 程式人生 > >C++11 實現信號量Semaphore類

C++11 實現信號量Semaphore類

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類