我想用std::lock()
替换以下代码:
for (mutex* m : mutexes) {
m->lock();
}
无论如何,我可以在std::lock ()
给出的那些互斥锁上调用std::vector<mutex*>
吗?
答案 0 :(得分:9)
不幸的是,标准库没有为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);
}