Boost.ASIO源码:pthread包装类——posix_event小结

本文介绍了Boost.ASIO库中posix_event类的用途和实现原理,它作为pthread条件变量的包装,用于调度器中唤醒阻塞线程。通过一个enabled标志位优化了锁的使用,简化了多线程并行处理。文章详细讲解了state_变量的双重功能,以及signal_all和wait函数的关键逻辑,展示了如何通过一个无符号整数高效地管理阻塞和唤醒状态。
摘要由CSDN通过智能技术生成

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_);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值