Оптимизация статических объектов хранения в контексте потока - PullRequest
1 голос
/ 19 июня 2019

Может ли компилятор оптимизировать статический объект хранения в контексте многопоточной программы?Я спрашиваю его, чтобы знать, если переменная, объявленная как статическая, например, генерирует побочный эффект при использовании в функции, вызываемой в потоке.

bool flag = false; // static storage duration object

void f(){ //function called in a thread
  flag = false;
  // do some work...
  flag = true;
}

//a possible representation of the code above after optimization
void f(){
  flag = true;
  // do some work...
} // is this possible to happen?

Я читаю некоторые ответы из здесь , но я не нашел ничего, что могло бы помочь.

1 Ответ

7 голосов
/ 19 июня 2019

Статическая длительность хранения не влияет на безопасность потока.В вашем примере второй кодовый блок был бы допустимым, если переупорядочение ничего не нарушает внутри f.

Вам по-прежнему нужна синхронизация для всех общих объектов, в которые записывает любой поток.В этом случае вы можете получить это, используя std::atomic<bool> для flag, например

std::atomic<bool> flag = false;

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

...