在两个线程之间共享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的主要内容,如果未能解决你的问题,请参考以下文章