繁体   English   中英

用std :: vector调用std :: lock() <mutex*>

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM