Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用std::vector调用std::lock()<;互斥*>;_C++_Multithreading_C++11 - Fatal编程技术网

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