我需要在两个线程之间共享一个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);
它是线程安全的吗?
谢谢。
答案 0 :(得分:3)
没有,这不会有帮助。
原子只使指针的存储/加载不可分割。当您取消引用它时,您只是直接访问deadline_timer
,不同步。
所以你可以
围绕截止时间计时器的所有访问进行传统的线程同步(例如使用mutex
)
使用Asio strand
创建一个“逻辑”组合。执行的线程,并注意只从该链访问死区计时器。
绞线方法可能更有效,但需要您更准确地考虑执行流程,以免意外创建数据竞争