在两个线程之间共享 deadline_timer

Share deadline_timer between two threads

我需要在两个线程之间共享一个 boost::deadline_timer。提升文档说 "The shared instances are not threadsafe"。这是一个示例代码:

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 吗?

Header:

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

构造函数:

m_timer = new boost::deadline_timer(m_io_service);

是thread-safe吗?

谢谢。

不,那没有用。

原子只使得指针的stores/loads不可分。当您取消引用它时,您只是直接访问 deadline_timer,不同步。

所以你可以

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

  • 使用 Asio strand 创建一个 'logical' 执行线程,并注意仅从该线程访问死线计时器。

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