在两个线程之间共享deadline_timer

时间:2015-01-23 21:10:45

标签: c++ boost timer boost-thread

我需要在两个线程之间共享一个boost :: deadline_timer。 boost文档说“共享实例不是线程安全的”。这是一个示例代码:

ClassA : public enable_shared_from_this<ClassA>{

  ClassA()
  {
    m_timer = new boost::deadline_timer(m_io_service);
  }

  destroy()
  {
    m_timer->cancel();
    delete m_timer;
    m_timer = NULL;
  }

  thread_method()
  {
    m_timer->expire_from_now(...);
    m_timer->async_wait(...);
  }

   run()
   {
     boost::thread t(ClassA::thread_method, shared_from_this);
   }
}

我的问题是“要同步destroy()和thread_method()之间的定时器访问,我可以使用boost :: atomic吗?

标题

boost::atomic<boost::deadline_timer*> m_timer;

构造

m_timer = new boost::deadline_timer(m_io_service);

它是线程安全的吗?

谢谢。

1 个答案:

答案 0 :(得分:3)

没有,这不会有帮助。

原子只使指针的存储/加载不可分割。当您取消引用它时,您只是直接访问deadline_timer,不同步。

所以你可以

  • 围绕截止时间计时器的所有访问进行传统的线程同步(例如使用mutex

  • 使用Asio strand创建一个“逻辑”组合。执行的线程,并注意只从该链访问死区计时器。

绞线方法可能更有效,但需要您更准确地考虑执行流程,以免意外创建数据竞争