質問ですが、Windows APIのSetEvent()やWaitForSingleObject()って、
内部で適切にメモリバリアを行うことが保証されていますか?

例えば、下記のケースにおいて、_WriteBarrier()や_ReadBarrier()は冗長?
(メインスレッド側)
 bTerminate = true;  // volatile bool型
 _WriteBarrier();
 SetEvent(hEvent); // スレッドを起床させる

(ワーカースレッド側)
 WaitForSingleObject(hEvent);  // 起床されるまで待つ
 _ReadBarrier();
 if (bTerminate) { .... } // メインスレッドから通知されたbTerminateに基づく処理