在两个线程之间共享 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 方法可能更有效,但需要您更准确地考虑执行流程,以免意外造成数据竞争
我需要在两个线程之间共享一个 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 方法可能更有效,但需要您更准确地考虑执行流程,以免意外造成数据竞争