非常に簡単なアプローチです。 2つのスレッド。 1は、ストレス下でのシステムの下でこれをログに記録しようとした場合InterlockedExchangeは、VMwareでは回避できません。
volatile __int32 p=0;
1つのスレッド(A)は唯一
while(1){
ExecuteAVeryCPUIntesiveThing();
InterlockedExchange(&p, 0);
}
を使用する他のスレッド(B)は
while(1){
if(0==InterlockedCompareExchange(&p,0,0))
InterlockedExchange(&p, 1);
}
を使用しています。 Aからの値がpでB.
に伝播されません (メモリスワップ、IO、ソケット、CPUスパイク..の多くは)0 の価値を持っているように見える。しかしBの視点pから 私の世界でAが値を0に設定すると、Bは値を検出して0に設定しなければなりません。 これはまさにそのように動作しますが、esxiを実行しているときは動作しません。
これは実際のハードウェアの下でも、いくつかの仮想システムではうまく動作しますが、VMWareではうまく動作していないようです。
私は気になったことがありますか?
OSゲスト:win2008サーバー
のx64用のMicrosoft(R)C/C++最適化コンパイラバージョン15.00.30729.01でコンパイルさコード
ホスト:ESXi 4.1の
更新:
レスポンスコメントは:はいそれは0と1の間でバウンスしますが、 と書かれているように、スレッドBはバウンスしません。なぜなら、pの値は決してBのパースペクティブで変化しないからです。
非常に正確な時点でA(ExecuteAVeryCPUIntesiveThing();)でコードブロックを実行したいと思います。
生産コードはより多くのスレッドとイベント、mutexとロックでいっぱいですが、実際には残っていますが、上記のコードを使用して、私はゲストに多くのCPU、mm、ioを生成すると再現できますos。
これはあまり意味がありません。あなたは何を達成しようとしています、もっと大きな仕事は何ですか? –
これは実際のコードではありません(InterlockedExchangeCompareは存在しません)ので、実際に行っているかどうかはわかりません。あなたはどのような方法で失敗したかは言わなかった。コードは0と1を 'p'にバウンスさせるだけです。実際、 'if'ステートメントはそれを与えても意味がないようです。そして、while(1)?本当の問題は何ですか? –
ここでは、インターロックを使用する理由は何ですか?なぜそれを使うのか、それは偽りのようだ。 MSVCの揮発性は、必要なすべてを提供します。 –