在两个线程之间共享deadline_timer

Share deadline_timer between two threads

本文关键字:共享 之间 deadline timer 线程 两个      更新时间:2023-10-16

我需要在两个线程之间共享一个boost::d eadline_timer。提升文档说"共享实例不是线程安全的"。下面是一个示例代码:

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);

它是线程安全的吗?

谢谢。

不,这无济于事。

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

所以你可以

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

  • 使用 Asio strand创建执行的"逻辑"线程,并注意仅从该链访问死线计时器。

链方法可能更有效,但需要您更准确地考虑执行流程,这样您就不会意外地创建数据竞争。