gpt4 book ai didi

c++ - 使用 std::vector 调用 std::lock ()

转载 作者:太空狗 更新时间:2023-10-29 19:58:28 28 4
gpt4 key购买 nike

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

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

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

最佳答案

不幸的是,标准库没有为 std::lock 提供重载。它需要一对指向可锁定对象的迭代器。使用 std::lock您必须在编译时知道可锁定对象的数量,并将它们作为参数传递给函数。但是,Boost 确实提供了一个 overload它需要迭代器,它可以与 std::mutex 一起使用.

您需要的另一 block 脚手架是 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

关于c++ - 使用 std::vector <mutex*> 调用 std::lock (),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21105647/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com