Невозможно изменить значение, переданное ref в другом потоке - PullRequest
0 голосов
/ 03 июля 2018

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

1 Ответ

0 голосов
/ 03 июля 2018

Аргументы функции потока перемещаются или копируются по значению. Если ссылочный аргумент должен быть передан в функцию потока, он имеет быть обернутым (например, с помощью std :: ref или std :: cref).

отсюда

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...