gpt4 book ai didi

c++ - `std::lock_guard` 对象没有名称时的不同行为

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:07:55 25 4
gpt4 key购买 nike

我正在了解 std::mutex , std::thread我对下面两段代码的不同行为感到惊讶:

#include <iostream>
#include <mutex>
#include <thread>
using namespace std;

std::mutex mtx;

void foo(int k)
{
std::lock_guard<std::mutex> lg{ mtx };
for (int i = 0; i < 10; ++i)
cout << "This is a test!" << i << endl;
cout << "The test " << k << " has been finished." << endl;
}

int main()
{
std::thread t1(foo, 1);
std::thread t2(foo, 2);
t1.join();
t2.join();
return 0;
}

输出是顺序的。但是如果我不命名变量 std::lock_guard<std::mutex> , 输出是无序的

void foo(int k)
{
std::lock_guard<std::mutex> { mtx }; // just erase the name of variable
for (int i = 0; i < 10; ++i)
cout << "This is a test!" << i << endl;
cout << "The test " << k << " has been finished." << endl;
}

好像std::lock_guard在第二种情况下没有用,为什么?

最佳答案

这个声明

std::lock_guard<std::mutex> { mtx };

不将创建的对象绑定(bind)到名称,它是一个临时变量,仅为该特定语句而存在。与此相反,具有名称并在堆栈上创建的变量会一直存在到创建它的范围的末尾。

this CppCon talk (从 31:42 开始),演示者将创建未绑定(bind)到局部变量的临时 std::lock_guard 实例列为 Facebook 代码库中的常见错误。

关于c++ - `std::lock_guard<std::mutex>` 对象没有名称时的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51963131/

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