2013-03-25 161 views
0

我有一个关于boost asio定时器和安全线程与他们合作的问题。比方说,我有以下类:使用boost :: asio定时器的线程安全工作

CTest.h:

class CTest 
{ 
    boost::asio::io_service io; 
    boost::asio::deadline_timer timer; 

    void Check(); 
    CTest(); 

    ~CTest(); 
}; 

而且CTest.cpp:

CTest::CTest(): 
timer (io, boost::posix_time::seconds(0)) 
{ 
    timer.async_wait(boost::bind(&CTest::Check, this)); 
    boost::thread t(boost::bind(&boost::asio::io_service::run, &io)); 
} 

void CTest::Check() 
{ 
    //some work 

    m_timer.expires_from_now(boost::posix_time::seconds(10)); 
    m_timer.async_wait(boost::bind(&CTest::Check, this)); 

} 

CTest::~CTest() 
{ 
    io.stop(); 
} 

所以,问题是如何完成检查线程安全的?我的意思是,这个Check函数可以在析构函数后调用,并且我们有一个崩溃。

回答

2

使用io_service :: stop()很少是你想要做的。

的几点:

  • 保持周围线程对象,并调用的Thread.join(),以确保它是完整的。
  • 不要调用io.stop(),调用m_timer.cancel()然后调用m_thread.join()进行清理。
  • 考虑使用shared_ptr和weak_ptr更干净地管理对象生存期(即:将weak_ptr实例绑定到async_wait回调中,而不是仅仅在this。在回调函数中,将weak_ptr转换为shared_ptr,如果有效,则调用方法。
  • m_timer西港岛线在多个线程中使用,则需要使用互斥来管理访问。

就在几个点。不会重写代码为您服务。

+0

考虑到你的第三个建议,是否认为'std :: enable_shared_from_this'在这里可能有用? – 2016-12-30 18:43:51

+1

@snow_abstraction不用于这种技术,因为销毁对象也会从'enable_shared_from_this'中销毁继承的数据成员,这意味着您无法检查有效性。 – janm 2016-12-31 02:13:44

1

你的析构函数应该停止所有的定时器,所以它们不会在对象被销毁后调用:m_timer.cancel()。另外,如果您想阻止同一对象上的同时方法调用,请将您的boost :: bindboost :: asio :: strand :: wrap包装在一起。查看asio文档的例子。

相关问题