首页 > 编程语言 > 详细

C++11 实现信号量Semaphore类

时间:2017-12-03 15:13:51      阅读:267      评论:0      收藏:0      [点我收藏+]
 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类

原文:http://www.cnblogs.com/waterfall/p/7966116.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!