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