[C++11]并发程序模板(std::thread)

1.基本知识(单一消费者wait,多生产者为例)


typedef struct {
    int val; //已经生产的数量记录,>0时 wait不需要等待
    std::mutex mutex;
    std::condition_variable cond;
} ns_semaphore_t;

static inline int ns_sem_wait(ns_semaphore_t *s)
{
    int rc = 0;
    std::unique_lock<std::mutex> lk(s->mutex); //unique_lock 默认构造函数的时候,对mutex上锁;在析构的时候解锁;保证cond.wait()执行的唯一性
    while (s->val == 0)//=0时候循环等待的原因是,val可能被其他的线程取走,确保val值真实存在,val是主角,cond只是提醒
        s->cond.wait(lk); //problem ???, input  unique_lock in case other thread call cond.wait().
//cond_wait:unlock->等待唤醒->lock,所以在while和cond_wait之间其他线程无法post消息
 s->val--; return rc;}
static inline void ns_sem_post(ns_semaphore_t *s)
{
      std::lock_guard<std::mutex> lk(s->mutex); //lock_guard 在构造中上,在析构中解锁,比unique简单
    s->val++;
    s->cond.notify_all();
}



unique_lock 或 lock_guard都是提供mutex的上锁解锁的管理工具
区别:unique_lock暂时可以理解为lock_guard的升级版,增加了许多成员函数


lock基础知识可以参考:http://www.cnblogs.com/haippy/p/3346477.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值