2013-03-25 166 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文檔的例子。

相關問題