Оптимизация статических объектов хранения в контексте потока

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

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 ответ

Решение

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

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

std::atomic<bool> flag = false;

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

Другие вопросы по тегам