Synchronization and Multiprocessor Issuesの記事を読みましたが、InterlockedCompareExchange と InterlockedExchange について質問があります。質問は、実際には記事の最後の例に関するものです。それらには2つの変数がiValue
ありfValueHasBeenComputed
、次CacheComputedValue()
を使用してそれぞれを変更しますInterlockedExchange
。
InterlockedExchange ((LONG*)&iValue, (LONG)ComputeValue()); // don't understand
InterlockedExchange ((LONG*)&fValueHasBeenComputed, TRUE); // understand
InterlockedExchange
改造に使えるのは分かるiValue
けど、やるだけでいいの?
iValue = ComputeValue();
では、実際にInterlockedExchange
iValue を設定するために使用する必要がありますか? または、他のスレッドは iValue を正しく認識しiValue = ComputeValue();
ます。iValue の後にあるため、他のスレッドは iValue を正しく認識しInterlockedExchange
ます。
A Principle-Based Sequential Memory Model for Microsoft Native Code Platformsという論文もあります。ほぼ同じコードの 3.1.1 の例があります。おすすめの一つMake y interlocked
。注意 - と の両方y
ではありませんx
。
更新
質問を明確にするためだけに。問題は、私が矛盾していることです。「同期とマルチプロセッサの問題」の例では、2 つのInterlockedExchange
. それどころか、例 3.1.1「基本的な Reodering」 (最初の例と非常に似ていると思います) では、Herb Sutter がこの推奨事項を示しています。
「y をインターロックする: y がインターロックされている場合、y は原子的に更新可能であるため競合はなく、a -> b -> d であるため x には競合がありません。」
. このドラフトでは、ハーブは 2 つの連動変数を使用しません (私が正しければ、彼はInterlockedExchange
のみに使用することを意味しますy
)。