gpt4 book ai didi

c++ - 为什么 std::move 对 std::unique_lock 没有任何影响?

转载 作者:可可西里 更新时间:2023-11-01 18:24:59 24 4
gpt4 key购买 nike

我有以下 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 从互斥体 m 中“解除绑定(bind)”。

我错过了什么?

最佳答案

void unlock(std::unique_lock<std::mutex> && ulock)

这里 ulock 是一个引用。一种特殊的引用,但仍然是引用。它只是另一个对象的别名。它的创建不涉及创建新对象或任何类型的所有权转移。同样,它的生命周期结束不会导致任何析构函数调用,它只是意味着您丢失了引用其他对象的别名(这并不重要,因为该函数无论如何都会结束)。

如果你想转移所有权,你需要一个对象,所以按值而不是按引用传递:

void unlock(std::unique_lock<std::mutex> ulock)

现在,您必须 move 原始锁,因为std::unique_lock不支持复制构造,只支持 move 构造。

关于c++ - 为什么 std::move 对 std::unique_lock 没有任何影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45947084/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com