我需要檢查我創建的boost :: thread是否從另一個線程運行。 This SO文章解釋,你可以通過調用做到這一點:確實boost :: thread :: timed_join(0)獲取一個鎖?
boost::posix_time::seconds waitTime(0);
myBoostThread.timed_join(waitTime);
我不能在我的客戶端線程中的關鍵部分。我能保證timed_join()
0時間自變量鎖定空閒嗎?
我需要檢查我創建的boost :: thread是否從另一個線程運行。 This SO文章解釋,你可以通過調用做到這一點:確實boost :: thread :: timed_join(0)獲取一個鎖?
boost::posix_time::seconds waitTime(0);
myBoostThread.timed_join(waitTime);
我不能在我的客戶端線程中的關鍵部分。我能保證timed_join()
0時間自變量鎖定空閒嗎?
Boost.Thread不提供無鎖保護timed_join()
。但是,實現總是會發生變化:
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。
不,沒有這樣的保證。
即使boost實現完全沒有鎖(我沒有檢查過),也不能保證底層的OS實現完全沒有鎖。
也就是說,如果在這裏使用了鎖,我會發現它們不會在應用程序中造成任何顯着的延遲,所以我會毫不猶豫地使用timed_join
,除非遇到嚴格的實時截止日期而不是等同於UI響應)。
不幸的是我的客戶端線程用於實時處理; mallocs,鎖等完全沒有限制。 – elSnape
然後我建議您自己調查一下'timed_join'及其下面的函數是如何實現的(包括操作系統保證的)。 –