2013-01-25 97 views
0

我需要檢查我創建的boost :: thread是否從另一個線程運行。 This SO文章解釋,你可以通過調用做到這一點:確實boost :: thread :: timed_join(0)獲取一個鎖?

boost::posix_time::seconds waitTime(0); 
myBoostThread.timed_join(waitTime); 

我不能在我的客戶端線程中的關鍵部分。我能保證timed_join() 0時間自變量鎖定空閒嗎?

回答

1

Boost.Thread不提供無鎖保護timed_join()。但是,實現總是會發生變化:

  • Boost.Thread爲pthread獲取互斥鎖,然後對條件變量執行定時等待。
  • Boost.Thread調用WaitForMultipleObjects for windows。它的文檔表明它會一直立即返回。但是,我不知道底層操作系統實現是否是無鎖的。

另外,考慮使用原子操作。雖然Boost 1.52目前不提供公共原子庫,但Boost.Smart_Ptr和Boost.Interprocess在它們的詳細名稱空間內都有原子整數。但是,這些都不保證無鎖定實現,並且Boost.Smart_Ptr的其中一個配置將鎖定pthread mutex。因此,您可能需要諮詢您的編譯器和系統文檔以確定無鎖實現。

儘管如此,這裏是使用boost::detail::atomic_count一個小例子:

#include <boost/chrono.pp> 
#include <boost/detail/atomic_count.hpp> 
#include <boost/thread.hpp> 

// Use RAII to perform cleanup. 
struct count_guard 
{ 
    count_guard(boost::detail::atomic_count& count) : count_(count) {} 
    ~count_guard() { --count_; } 
    boost::detail::atomic_count& count_; 
}; 

void thread_main(boost::detail::atomic_count& count) 
{ 
    // Place the guard on the stack. When the thread exits through either normal 
    // means or the stack unwinding from an exception, the atomic count will be 
    // decremented. 
    count_guard decrement_on_exit(count); 
    boost::this_thread::sleep_for(boost::chrono::seconds(5)); 
} 

int main() 
{ 
    boost::detail::atomic_count count(1); 
    boost::thread t(thread_main, boost::ref(count)); 

    // Check the count to determine if the thread has exited. 
    while (0 != count) 
    { 
    std::cout << "Sleeping for 2 seconds." << std::endl; 
    boost::this_thread::sleep_for(boost::chrono::seconds(2)); 
    } 
} 

在這種情況下,擴展at_thread_exit()可作爲替代使用RAII

1

不,沒有這樣的保證。
即使boost實現完全沒有鎖(我沒有檢查過),也不能保證底層的OS實現完全沒有鎖。

也就是說,如果在這裏使用了鎖,我會發現它們不會在應用程序中造成任何顯着的延遲,所以我會毫不猶豫地使用timed_join,除非遇到嚴格的實時截止日期而不是等同於UI響應)。

+0

不幸的是我的客戶端線程用於實時處理; mallocs,鎖等完全沒有限制。 – elSnape

+0

然後我建議您自己調查一下'timed_join'及其下面的函數是如何實現的(包括操作系統保證的)。 –

相關問題