posix_event介绍
该类用在scheduler中,用于唤醒阻塞的线程,下面代码中的conditionally_enabled_event实际上就是posix_event的包装类:
class scheduler
: public execution_context_service_base<scheduler>,
public thread_context
{
// ...
private:
// The event type used by this scheduler.
typedef conditionally_enabled_event event;
// Event to wake up blocked threads.
event wakeup_event_;
// ...
}
至于为什么要用conditionally_enabled_event来包一层呢,主要是为了多加一个enabled这个flag。
以前也总结过,io_service能够根据传入的concurrency_hint决定是否采用多线程并行,若是不采用并行,则理所当然的,加锁就成了没必要的操作,为了对这里面涉及到的锁进行统一化处理,他们决定用一个enabled标志位来判断是否真的加锁。
而对于event,自然也是同理。如以下的conditionally:
void clear(conditionally_enabled_mutex::scoped_lock& lock)
{
if (lock.mutex_.enabled_) // 这里进行enabled控制
event_.clear(lock); // 调用posix_event的接口
}
posix_event源码
posix_event结构也很简单,实际上就是pthread的包装。posix_event就只有两个成员变量:
class posix_event
: private noncopyable
{
//。。。
private:
//。。。
::pthread_cond_t cond_; // 条件变量
std::size_t state_;
};
cond_很好理解,就是用来控制阻塞唤醒的条件变量。而state_是一个无符号整数,它的设计很巧妙,state_有2个作用:一是用来在wait中作为条件控制判断的flag;二是用来判断是否还有处于阻塞在该条件变量上的线程。下面详细说明。
以signal_all函数为例子:
template <typename Lock>
void signal_all(Lock& lock)
{
BOOST_ASIO_ASSERT(lock.locked());
(void)lock;
state_ |= 1;
::pthread_cond_broadcast(&cond_);