1.基本知识(单一消费者wait,多生产者为例)
unique_lock 或 lock_guard都是提供mutex的上锁解锁的管理工具
区别:unique_lock暂时可以理解为lock_guard的升级版,增加了许多成员函数
lock基础知识可以参考:http://www.cnblogs.com/haippy/p/3346477.html
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