Поток связи, когда режим отладки и режим выпуска - PullRequest
0 голосов
/ 13 февраля 2020

Потоки не связываются друг с другом в режиме выпуска, но они общаются в режиме отладки. Также потоки общаются, если я отключаю поток в течение 0,1 секунды в режиме выпуска. Почему это происходит? Есть пример для вас.

main. cpp

int main(){
bool foo=false;


thread tk(control,ref(foo));
tk.detach();
this_thread::sleep_for(1s);
foo=true;
while(true){
//it is for program is not finished

}
}

foo. cpp

void control(bool &x){
while(x==false){
   //When release mode, program cannot go out from this.
}

}

И есть рабочий пример для вас

main. cpp

int main(){
bool foo=false;


thread tk(control,ref(foo));
tk.detach();
this_thread::sleep_for(1s);
foo=true;
while(true){
//it is for program is not finished

}
}

foo. cpp

void control(bool &x){
while(x==false){
  this_thread::sleep_for(1s);
//it can go out.
}

}

1 Ответ

2 голосов
/ 13 февраля 2020

Они дали вам правильный ответ в комментариях.

Использование простого bool для связи между потоками создает гонку данных :

, когда оценка выражения записывается в ячейку памяти и выполняется другая оценка читает или изменяет ту же область памяти, выражения, как говорят, конфликтуют. Программа с двумя конфликтующими оценками имеет гонку данных, если только

  • обе оценки не выполняются в одном потоке или в одном и том же обработчике сигналов, или
  • обе конфликтующие оценки не являются атомами c операции (см. std::atomic) или
  • одна из конфликтующих оценок происходит раньше другой (см. std::memory_order)

Если происходит гонка данных, поведение программы не определено.

Исправлено использование std::atomic<bool> вместо bool.

...