Я пытался продемонстрировать коллеге, почему вам лучше передать константные ссылки на функции, выполняющие операции только для чтения со следующим кодом. К моему удивлению, он печатает «Это безопасно!», Даже если я изменяю значение 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;
}