天天看点

并发编程(二):分析Boost对 互斥量和条件变量的封装及实现生产者消费者问题

请阅读上篇文章《并发编程实战: posix 使用互斥量和条件变量实现生产者/消费者问题》。当然不阅读亦不影响本篇文章的阅读

并发编程(二):分析Boost对 互斥量和条件变量的封装及实现生产者消费者问题

boost的互斥量,条件变量做了很好的封装,因此比“原生的”posix mutex,condition variables好用。然后我们会通过分析boost相关源码看一下boost linux是如何对pthread_mutex_t和pthread_cond_t进行的封装。

首先看一下condition_variable_any的具体实现,代码路径:/boost/thread/pthread/condition_variable.hpp

condition_variable_any的构造函数是对于内部使用的mutex和cond的初始化,对应的,析构函数则是这些资源的回收。

boost_verify的实现:

因此不同于assert在release版的被优化掉不同,我们可以放心的使用boost_verity,因此它的表达式肯定会被求值,而不用担心assert的side effect。

接下来看一下condition_variable_any的核心实现:wait

首先看一下lock_on_exit:

代码很简单,实现了在调用activate时将传入的lock解锁,在该变量生命期结束时将guard的lock加锁。

接下来的detail::interruption_checker check_for_interruption(&internal_mutex,&cond);是什么意思呢?from /boost/thread/pthread/thread_data.hpp

代码面前,毫无隐藏。那句话就是此时如果有interrupt,那么就interrupt吧。否则,lock传入的mutex,也是为了res=pthread_cond_wait(&cond,&internal_mutex);做准备。

关于线程的中断点,可以移步《【boost】boost库中thread多线程详解5——谈谈线程中断》。

对于boost::mutex,大家可以使用同样的方法去解读boost的实现,相对于condition variable,mutex的实现更加直观。代码路径:/boost/thread/pthread/mutex.hpp。

boost对于pthread_mutex_t和pthread_cond_t的封装,方便了开发者的使用的资源的安全有效管理。当然,在不同的公司,可能也都有类似的封装,学习boost的源码,无疑可以加深我们的理解。在某些特定的场合,我们也可以学习boost的封装方法,简化我们的日常开发。

最后,奉上简单的生产者、消费者的boost的实现,和前文《并发编程实战: posix 使用互斥量和条件变量实现生产者/消费者问题》相比,我们可以看到boost简化了mutex和condition variable的使用。以下代码引自《boost程序库完全开发指南》:

最后说一句,condition_variable_any == condition, from /boost/thread/condition.hpp

继续阅读