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*>?
不幸的是,标准库没有提供重载,因为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)