(あなたがC#のを参照していると仮定。)
あなたは文字通りThread
を意味する場合は、あなたの答えは、暗黙的にメモリバリアを生成Thread.Join
かどうかに依存して(すでに与えられた解答ごとに、それはおそらくないいます、) 。
ただし、Alpha
とBeta
は(おそらくスレッドプールからの)バックグラウンドスレッドで実行されるユーザ定義のタスクであること、および「待機中」2つのタスク、その後、間、ユーザーレベルの同期を参照していることを意味している場合シグナリング構造または明示的なバリアが導入されていない限り、データはでなく、である可能性が高いです。ここで
は簡単な例です:
public class Program
{
static string A = "foo";
static volatile bool isAlphaReady = false;
static void Alpha()
{
A = "bar";
isAlphaReady = true;
}
static void Beta()
{
while (!isAlphaReady)
; // Wait by polling
Console.WriteLine(A);
}
static void Main(string[] args)
{
new Thread(Alpha).Start();
new Thread(Beta).Start();
Console.ReadKey();
}
}
Beta
は常にA
の値として出力"bar"
が、これは弱い同期動作とマルチプロセッサシステム上で保証されていないということ(直感的に)表示されますが(のようなItanium)の場合、代わりに"foo"
が出力されることがあります。
私はこの例では動作しないと思います。私は、CLRが書き込みを保証し、書き込みが確実にスワップされないと考えました。 – Imran