我有以下C ++(11)代码:
#include <mutex>
void unlock(std::unique_lock<std::mutex> && ulock)
{
}
int main(void)
{
std::mutex m;
std::unique_lock<std::mutex> ulock(m);
unlock(std::move(ulock));
if (ulock.mutex() == &m || ulock.owns_lock())
{
throw std::runtime_error("");
}
return 0;
}
我无法弄清楚为什么在从unlock()
返回后仍然保留互斥锁。我的期望是std::move()
在从unlock()
调用返回时导致锁超出范围(并由析构函数解锁)。至少,似乎std::move()
应该导致ulock
成为&#34;未绑定&#34;来自互斥体m
。
我错过了什么?
答案 0 :(得分:12)
void unlock(std::unique_lock<std::mutex> && ulock)
此处ulock
是参考。一种特殊的参考,但仍然是一个参考。它只是另一个对象的别名。它的创建不涉及创建新对象或任何类型的所有权转移。同样,它的生命周期结束不会导致任何析构函数调用,它只是意味着你丢失了引用其他对象的别名(不重要,因为函数无论如何都会结束)。
如果您想转让所有权,则需要对象,因此请按值而不是按引用传递:
void unlock(std::unique_lock<std::mutex> ulock)
现在,您必须move
原始锁定,因为std::unique_lock
不支持复制构造,只移动构造。