使用std :: vector <mutex *> </mutex *>调用std :: lock()

时间:2014-01-14 03:34:17

标签: c++ multithreading c++11

我想用std::lock()替换以下代码:

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

无论如何,我可以在std::lock ()给出的那些互斥锁上调用std::vector<mutex*>吗?

1 个答案:

答案 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);
}

Live demo