2013-05-09 16 views
2

我是新增加的線程(來自Win32線程,可能毀了我)。是否有與此「safe_read」調用等效的提升

所以我試圖做一個更「RAII」的方式來檢查工作循環是否應該繼續。所以我做了這個簡單的功能:

template<typenameT> 
T safe_read(const T& t,boost::mutex& mutex) 
{ 
    boost::interprocess::scoped_lock lock(mutex); 
    return t; 
} 

是否有一個提升等同於此,因爲它好像我會一直使用這個?另外這是一個可以接受的電話?

的想法是能夠安全地做到這一點,而無需使用鎖怪異:

while(!safe_read(this->is_killing_,this->is_killing_mutex_)) 
{ 
    DoWork(); 
} 
+0

無論您是否鎖定,布爾值都將爲true或false。退出safe_access調用會發生什麼? – Nick 2013-05-09 15:10:16

+1

@Nick,鎖定在那裏,因爲布爾值正在從另一個線程中更改。因此,如果單獨的線程在while讀取布爾值時更改布爾值,則行爲是「未定義的」。大多數電腦在內存模型中可能有足夠的同步控制來處理,但我不相信它。 – IdeaHat 2013-05-09 15:16:39

+0

@hmjd我沒有,這看起來像一個更清潔的解決方案,我想這就是答案! – IdeaHat 2013-05-09 15:31:11

回答

3

boost::atomic<bool>在boost v1.53.0中添加,基於C++ 11 std::atomic s。例如:

#include <boost/atomic.hpp> 

boost::atomic<bool> is_killing (false); 

while (!is_killing) 
{ 
} 

這將消除從代碼明確mutexsafe_access功能,提供所需的同步。

+0

這真的很適合這個!後續是一個稍微不同的實例,我希望能夠鎖定一組變量...正在做'原子'猶太教徒? – IdeaHat 2013-05-09 16:05:21

+0

@MadScienceDreams,請參閱[限制](http://www.boost.org/doc/libs/1_53_0_beta1/doc/html/atomic/limitations.html)部分。 – hmjd 2013-05-09 16:09:46

+0

是啊,它看起來不值得。但它認爲你可以使一個原子鎖lock_guard(必須仔細檢查)。 – IdeaHat 2013-05-09 16:16:44

0

,我不認爲它的工作原理,你覺得它的方式,因爲一旦safe_access函數返回時,鎖發行了。

+0

這就是我想要的。因爲t是通過引用讀入的,但是按值傳遞,這個調用本質上是創建T的快照副本並返回它,在safe_access返回後釋放鎖。 – IdeaHat 2013-05-09 15:20:27

相關問題