![](/img/trans.png)
[英]Does std::function lock a mutex when calling an internal mutable lambda?
[英]Calling std::lock () with std::vector <mutex*>
我想用std::lock()
替换下面的代码:
for (mutex* m : mutexes) {
m->lock();
}
无论如何,我可以在给定std::vector<mutex*>
那些互斥std::lock ()
调用std::lock ()
吗?
不幸的是,标准库没有为std::lock
提供重载,它带有一对指向可锁定对象的迭代器。 要使用std::lock
您必须在编译时知道可锁定对象的数量,并将它们作为参数传递给函数。 但是,Boost确实提供了一个带有迭代器的重载 ,并且它可以与std::mutex
。
你需要的另一个脚手架是boost::indirect_iterator
; 当您取消引用迭代器时,这将应用额外的解除引用(因为你有std::vector<std::mutex*>
而不是std::vector<std::mutex>
。后者因为std::mutex
无论如何都不会非常有用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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.