33

在“C++ Concurrency in Action”一书中阅读以下方法

std::unique_lock<std::mutex> wait_for_data()
{
    std::unique_lock<std::mutex> head_lock(head_mutex);
    data_cond.wait(head_lock,[&]{return head.get()!=get_tail();});
    return std::move(head_lock);
 }

我不明白为什么 head_lock 在返回时是 std::move-ed。我对移动用法和 RVO 的概念和直觉与C++11 右值和移动语义混淆(return 语句)中共享的观点相匹配

但我倾向于相信作者会更好地了解。有人可以澄清什么时候 std::move 返回值更好,并且有什么特别关于锁的东西吗?谢谢。

4

1 回答 1

30

有或没有std::move. 局部变量*的名称在语句中被视为右值return,导致在两种情况下都调用移动构造函数。作者可能std::move出于文体原因使用,以明确锁定正在移动。它确实会干扰 NRVO,但与unique_lock锁定和等待的成本相比,将 a 移动到这里的成本可能是最小的。

用@Deduplicator 的话来说,这是“为了强调实际语义而进行的悲观化”。

你可以自己测试这个 -unique_lock不能被复制,所以return head_lock;如果它是副本就不会编译。


*这是 C++14 规则。C++11 规则仅限于允许或将允许复制省略的情况,但变量是函数参数这一事实除外。就这个问题而言,这种差异并不重要,因为head_lock显然符合复制省略的条件。

于 2014-09-24T10:27:15.130 回答