在两个线程之间共享deadline_timer

Posted

技术标签:

【中文标题】在两个线程之间共享deadline_timer【英文标题】:Share deadline_timer between two threads 【发布时间】:2015-01-23 21:10:44 【问题描述】:

我需要在两个线程之间共享一个 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);

它是线程安全的吗?

谢谢。

【问题讨论】:

你有没有试过自己编译代码看看有没有问题? @inetknght 为什么你需要知道?他并没有真正寻求有关编译器错误或类似问题的帮助。我认为那里有足够的信息(如果不是太多)。 代码编译但有时我会崩溃,因为线程试图访问 m_timer 而另一个线程已删除 m_timer。所以我想我需要在destroy()和thread_method()中使用互斥锁,不是吗? 【参考方案1】:

不,这无济于事。

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

所以你可以

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

使用 Asio strand 创建一个“逻辑”执行线程,并注意仅从该线程访问截止时间计时器。

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

【讨论】:

我将使用互斥锁,它更容易。谢谢。

以上是关于在两个线程之间共享deadline_timer的主要内容,如果未能解决你的问题,请参考以下文章

如何在两个线程之间共享数据

在两个线程之间共享 QAxObject?

两个线程之间的列表共享

不要同时在两个线程之间共享相同的套接字

在两个线程之间使用 LinkedBlockingQueue 是不是意味着我们不需要同步它们对共享数据的访问?

在两个单独的线程之间共享一个队列,用于在 UDP 广播服务器中接收和处理数据