gpt4 book ai didi

c++ - 无法修改其他线程中 ref 传递的值

转载 作者:搜寻专家 更新时间:2023-10-31 01:28:50 25 4
gpt4 key购买 nike

我试图向一位同事演示为什么您最好将 const 引用传递给使用以下代码执行只读操作的函数。令我惊讶的是它打印出“It's safe!”,即使我在另一个线程休眠时更改了 passedBool 的值。

我试图查明我是否在某处打错了字,编译器是否优化了代码并通过复制传递 passedBool 以避免一些开销,或者是否启动另一个线程创建了 passedBool.

class myClass
{
public:
myClass(bool& iBool)
{
t = thread(&myClass::myMethod,this,iBool);
}

~myClass()
{
t.join();
}

private:
thread t;

void myMethod(bool& iBool)
{
this_thread::sleep_for(chrono::seconds(1));

if(iBool)
cout << "It's safe!" << endl;
else
cout << "It's NOT safe!!!" << endl;
}
};


void main()
{
bool passedBool = true;

cout << "Passing true" << endl;
myClass mmyClass(passedBool);

cout << "Changing value for false" <<endl;
passedBool = false;

cout << "Expect \"It's NOT safe!!!\"" <<endl;
}

最佳答案

The arguments to the thread function are moved or copied by value. If a reference argument needs to be passed to the thread function, it has to be wrapped (e.g. with std::ref or std::cref).

from here

关于c++ - 无法修改其他线程中 ref 传递的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51154486/

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