并发程序模板(std::thread)

来源:互联网 发布:图片分割打印软件 编辑:程序博客网 时间:2024/06/01 10:43

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()    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

                                             
0 0
原创粉丝点击