首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >移动std::unique_locks的std::vector

移动std::unique_locks的std::vector
EN

Stack Overflow用户
提问于 2013-07-23 17:43:45
回答 2查看 1.1K关注 0票数 0

我有一个由几个“块”组成的数据结构。对于每个块,我都有互斥锁。我想实现一个锁定整个数据结构的方法,并将此锁定移动到调用函数。下面是我的代码:

代码语言:javascript
复制
std::vector<std::unique_lock<boost::shared_mutex>> lock_array() 
{
    std::vector<std::unique_lock<boost::shared_mutex>> locks;
    for(size_t block = 0; block < BLOCK_COUNT; ++block)
    {
        locks.push_back(std::unique_lock<boost::shared_mutex>(mutexes[block]));
    }
    return std::move(locks);
}

如果我以这种方式调用它,我的数组还会被锁定吗?

代码语言:javascript
复制
void some_method()
{
    auto locks = lock_array();
    ...
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-23 18:09:04

是。移动unique_lock将保留锁定,而移动向量应该完全不会影响锁定。您可以验证以下内容:

代码语言:javascript
复制
void some_method()
{
    auto locks = lock_array();
    for (auto const & lock : locks) {
        assert(lock.owns_lock());
    }
}

另外,请注意在返回时不需要std::move;返回值无论如何都会被移动(除非移动被省略)。

票数 3
EN

Stack Overflow用户

发布于 2013-07-23 18:12:29

您已将lockslock_array()函数中移出,编译器应使用RVO锁定移出lock_array(),否则将出现编译器错误,因为unique_lock是可移动但不可复制的。

锁仍然是锁定的,因为它们在构造过程中获得了锁,并且只有在锁超出范围时才会被销毁。您的传输操作不会销毁锁定。

§30.4.2.2

unique_lock类型的对象

控制作用域中可锁定对象的所有权。可锁定对象的所有权可以在构造时或构造之后获得,并且可以在获得之后转移给另一个unique_lock对象。unique_lock类型的对象不可复制,但可以移动。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17806697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档