Оптимизация статических объектов хранения в контексте потока
Может ли компилятор оптимизировать статический объект хранения в контексте многопоточной программы? Я спрашиваю его, чтобы знать, генерирует ли переменная, объявленная как статическая, например, побочный эффект, когда используется в функции, вызываемой в потоке.
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;
Правило безопасности потоков заключается в том, что если у вас есть объект, совместно используемый несколькими потоками, и хотя бы один из них является записывающим, то вам нужна синхронизация. Если вы этого не сделаете, то у вас есть гонка данных, которая является неопределенным поведением.