0

スレッドAlphaがロックなしで変数Aに書き込んでいるとします。第2のスレッドBetaAlphaが終了するのを待っており、次に変数Aを読み込みます。2番目のスレッドが最初のスレッドの終了を待つ場合、メモリバリアが必要ですか?

Aの内容が新鮮でない可能性はありますか?メモリの書き込みがスレッドの存続期間を超えて遅延することはありますか?スレッドAlphaの終了を待つ標準的なメカニズムは、暗黙的にメモリの障壁として機能しませんか?

UPDATE 1

メモリバリアが含まれていない待機中のいずれかの例がありますか?

答えて

4

ほぼ確実に(スレッド終了を待つために使用されるAPIは、独自の目的でメモリバリアを使用する必要があります)、使用されている特定のスレッドAPIについて話す必要があります。

たとえば、POSIXはpthread_join()ため、このような保証を行いますhttps://stackoverflow.com/a/3208140/12711

とWin32ドキュメント、それは(例えば、スレッドハンドル)オブジェクト上で待機するように同期APIだとメモリの障壁を課し:http://msdn.microsoft.com/en-us/library/ms686355.aspx

2

このスレッドライブラリがどのような保証を提供しているかによって異なります。特に、pthread_join()はdefined to be a memory barrierです。ほとんどの場合、スレッド結合にはメモリバリアが必要ですが、必ずしもそうでないとは考えられません。

0

(あなたがC#のを参照していると仮定。)

あなたは文字通りThreadを意味する場合は、あなたの答えは、暗黙的にメモリバリアを生成Thread.Joinかどうかに依存して(すでに与えられた解答ごとに、それはおそらくないいます、) 。

ただし、AlphaBetaは(おそらくスレッドプールからの)バックグラウンドスレッドで実行されるユーザ定義のタスクであること、および「待機中」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"が出力されることがあります。

+0

私はこの例では動作しないと思います。私は、CLRが書き込みを保証し、書き込みが確実にスワップされないと考えました。 – Imran

関連する問題