0

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

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();
    ...
}
4

2 回答 2

3

是的。移动 aunique_lock将保留锁,移动向量根本不会影响锁。您可以验证这一点:

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

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

于 2013-07-23T10:09:04.313 回答
1

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

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

§ 30.4.2.2

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

于 2013-07-23T10:12:28.537 回答