我有一个由几个“块”组成的数据结构。对于每个块,我都有互斥锁。我想实现一个锁定整个数据结构的方法,并将此锁定移动到调用函数。下面是我的代码:
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();
...
}发布于 2013-07-23 18:09:04
是。移动unique_lock将保留锁定,而移动向量应该完全不会影响锁定。您可以验证以下内容:
void some_method()
{
auto locks = lock_array();
for (auto const & lock : locks) {
assert(lock.owns_lock());
}
}另外,请注意在返回时不需要std::move;返回值无论如何都会被移动(除非移动被省略)。
发布于 2013-07-23 18:12:29
您已将locks从lock_array()函数中移出,编译器应使用RVO或将锁定移出lock_array(),否则将出现编译器错误,因为unique_lock是可移动但不可复制的。
锁仍然是锁定的,因为它们在构造过程中获得了锁,并且只有在锁超出范围时才会被销毁。您的传输操作不会销毁锁定。
§30.4.2.2
unique_lock类型的对象
控制作用域中可锁定对象的所有权。可锁定对象的所有权可以在构造时或构造之后获得,并且可以在获得之后转移给另一个unique_lock对象。unique_lock类型的对象不可复制,但可以移动。
https://stackoverflow.com/questions/17806697
复制相似问题