しかし以下のような実装のときrunningにvolatileが本当に要らないかどうかわわからん…

void bar() { (内部でlockを行う) }

====↓↓↓異なる翻訳単位↓↓↓====

void foo {
 bool running = false;  // runningはローカル変数
 while (running) {
  bar();  // 一見runninguへの副作用が考えられないシグネチャ
 }
}

どうやっているのかは知らんが、ウィンドーズの同期系API(上の例でbar()にあたる)は
うまいことやってくれる(と思う!