我想與std::lock()
替換下面的代碼:調用的std ::鎖()的標準::矢量<mutex*>
for (mutex* m : mutexes) {
m->lock();
}
反正我有可以調用上給出一個std::vector<mutex*>
這些互斥鎖std::lock()
?
我想與std::lock()
替換下面的代碼:調用的std ::鎖()的標準::矢量<mutex*>
for (mutex* m : mutexes) {
m->lock();
}
反正我有可以調用上給出一個std::vector<mutex*>
這些互斥鎖std::lock()
?
不幸的是,標準庫不會爲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);
}
工作很好,謝謝! – Jeremy
如果你需要鎖定向量中的每個元素,難道你不能只保留一個互斥量來控制對整個向量的訪問嗎?然後你可以使用'std :: lock()' – chbaker0
@mebob這不一定保留相同的語義。想象一下'vector'包含十幾個互斥體,每個互斥體在分別訪問十幾個不同的對象時提供互斥。但是有一部分代碼需要同時鎖定所有這些對象的訪問權限。這就是你需要上面的'std :: lock()'調用的地方。現在,如果要用一個互斥體替換那些互斥體,那麼在訪問其中的任何*時,都需要鎖定對所有對象的訪問權限,而不是在前一個場景中的一個部分中進行訪問。 – Praetorian
@Praetorian好的,這很有道理。謝謝 – chbaker0