これは「何が違うのか」という答えですが、コードがリリースモードで競合状態になっている理由に対する完全な答えではないかもしれません。
変更されることの 1 つは、VS の外部でリリースする場合に、ランタイムによって使用されるヒープです。私が理解している限り、リリースモードでもVS内でデバッグヒープを使用します。
定義によるヒープ割り当てはロックする必要があるため、デバッグ ヒープ (クライアント コードに渡される前にメモリをいっぱいにし、メモリが解放されると再びいっぱいにする) を使用すると、競合するスレッドがより頻繁にブロックされます (より順次実行されます)。したがって、これがレースが発生する理由の一部であることがわかる場合があります。
デバッグ環境で環境変数を設定する_NO_DEBUG_HEAP=1
と (Configuration->Debugging->Environment Variables...)、デバッガーでも同じ結果が得られます。
残念ながら、この種のものはデバッグが非常に難しい場合があります。私が便利だと思ったことの 1 つは、毎回何かを出力するのではなく、「行った場所」の値の配列を保存することです (配列が単純であればあるほど良い - 整数値、または小さな文字列など)。 . デバッガーで停止するか、何らかの方法でクラッシュを検出できる場合は、「トレース」をダンプして、現在の場所にどのように到達したか、どのスレッドが関与しているかを確認できます。