2014-01-14 32 views
3

我想與std::lock()替換下面的代碼:調用的std ::鎖()的標準::矢量<mutex*>

for (mutex* m : mutexes) { 
    m->lock(); 
} 

反正我有可以調用上給出一個std::vector<mutex*>這些互斥鎖std::lock()

+0

如果你需要鎖定向量中的每個元素,難道你不能只保留一個互斥量來控制對整個向量的訪問嗎?然後你可以使用'std :: lock()' – chbaker0

+2

@mebob這不一定保留相同的語義。想象一下'vector'包含十幾個互斥體,每個互斥體在分別訪問十幾個不同的對象時提供互斥。但是有一部分代碼需要同時鎖定所有這些對象的訪問權限。這就是你需要上面的'std :: lock()'調用的地方。現在,如果要用一個互斥體替換那些互斥體,那麼在訪問其中的任何*時,都需要鎖定對所有對象的訪問權限,而不是在前一個場景中的一個部分中進行訪問。 – Praetorian

+0

@Praetorian好的,這很有道理。謝謝 – chbaker0

回答

8

不幸的是,標準庫不會爲std::lock提供一個重載,它將一對迭代器指向可鎖定對象。要使用std::lock,您必須在編譯時知道可鎖定對象的數量,並將它們作爲參數傳遞給該函數。但是,Boost確實提供了一個採用迭代器的overload,它將與std::mutex一起使用。

你需要的另一塊腳手架是boost::indirect_iterator;這將適用於當你提領迭代器一個額外的解引用(必要的,因爲你有std::vector<std::mutex*>,而不是std::vector<std::mutex>,後者將不會是非常有用的反正因爲std::mutex不能被複制或移動。)

#include <boost/thread/locks.hpp> 
#include <boost/iterator/indirect_iterator.hpp> 

#include <vector> 
#include <mutex> 

int main() 
{ 
    using mutex_list = std::vector<std::mutex*>; 
    mutex_list mutexes; 

    boost::indirect_iterator<mutex_list::iterator> first(mutexes.begin()), 
                last(mutexes.end()); 
    boost::lock(first, last); 
} 

Live demo

+0

工作很好,謝謝! – Jeremy

相關問題