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

Jer*_*emy 3 c++ multithreading c++11

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

for (mutex* m : mutexes) {
   m->lock();
}
Run Code Online (Sandbox Code Playgroud)

无论如何我可以调用std::lock ()这些互斥锁给出一个std::vector<mutex*>

Pra*_*ian 9

不幸的是,标准库没有提供重载,因为std::lock它需要一对指向可锁定对象的迭代器.要使用,std::lock您必须在编译时知道可锁定对象的数量,并将它们作为参数传递给函数.但是,Boost确实提供了一个带有迭代器的重载,并且它可以使用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);
}
Run Code Online (Sandbox Code Playgroud)

现场演示