C++ 使用std::vector调用std::lock()<;互斥*>;
我想将以下代码替换为C++ 使用std::vector调用std::lock()<;互斥*>;,c++,multithreading,c++11,C++,Multithreading,C++11,我想将以下代码替换为std::lock(): 如果给定一个std::vector,我是否可以在这些互斥体上调用std::lock()?不幸的是,标准库没有为需要一对指向可锁定对象的迭代器的对象提供重载。要使用std::lock,必须知道编译时可锁定对象的数量,并将它们作为参数传递给函数。然而,Boost确实提供了一个需要迭代器的函数,它将与std::mutex一起工作 你需要的另一块脚手架是;当您取消引用迭代器时,这将应用额外的取消引用(需要,因为您有std::vector而不是std::vec
std::lock()
:
如果给定一个
std::vector
,我是否可以在这些互斥体上调用std::lock()
?不幸的是,标准库没有为需要一对指向可锁定对象的迭代器的对象提供重载。要使用std::lock,必须知道编译时可锁定对象的数量,并将它们作为参数传递给函数。然而,Boost确实提供了一个需要迭代器的函数,它将与std::mutex
一起工作
你需要的另一块脚手架是;当您取消引用迭代器时,这将应用额外的取消引用(需要,因为您有std::vector
而不是std::vector
。后者无论如何都不会非常有用,因为std::mutex
无法复制或移动。)
#包括
#包括
#包括
#包括
int main()
{
使用互斥列表=std::vector;
互斥体列表互斥体;
boost::间接迭代器优先(mutex.begin()),
last(mutex.end());
boost::lock(第一个,最后一个);
}
如果需要锁定向量中的每个元素,难道不能简单地保留一个互斥锁来控制对整个向量的访问吗?然后可以使用不一定保留相同语义的
std::lock()
@mebob。假设向量
包含十几个互斥体,每个互斥体在分别访问十几个不同对象时提供互斥。但有一段代码需要同时锁定对所有这些对象的访问。这就是您需要上面的std::lock()
调用的地方。现在,如果要将这十几个互斥体替换为一个互斥体,那么在访问其中任何一个对象时,都需要锁定对所有对象的访问,而不是在上一个场景中只在一个部分中执行此操作。@Praetorian好的,这是有意义的。非常感谢。
for (mutex* m : mutexes) {
m->lock();
}
#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);
}