繁体   English   中英

移动std :: vector的std :: unique_locks

[英]Move std::vector of std::unique_locks

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

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

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

void some_method()
{
    auto locks = lock_array();
    ...
}

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

void some_method()
{
    auto locks = lock_array();
    for (auto const & lock : locks) {
        assert(lock.owns_lock());
    }
}

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

lock_array() lockslock_array()函数中lock_array() ,编译器应使用RVO锁移出lock_array() ,否则由于unique_lock是可移动但不可复制的,因此会出现编译器错误。

锁仍处于锁定状态,因为它们在构造期间会获取锁,并且仅在锁超出范围时才会销毁。 您的转移操作不会破坏锁。

第30.4.2.2节

类型为unique_lock的对象控制范围内可锁定对象的所有权。 可锁定对象的所有权可以在构造时或构造之后获取,并且可以在获取后转移到另一个unique_lock对象。 类型为unique_lock的对象不可复制,但可以移动。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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