回答

2

这取决于你的线程库提供了什么保证。特别是,pthread_join()是defined to be a memory barrier。在大多数情况下,线程加入将涉及内存障碍,但并非不可能总是如此。

0

(假设你指的是C#)。

如果你的意思Thread从字面上看,那么你的答案取决于Thread.Join是否隐含产生记忆障碍(其中,每已经给出答案,它可能不会) 。

但是,如果你的意思是AlphaBeta是在后台线程(可能来自线程池)执行用户定义的任务,而“等待”是指两个任务,然后之间的用户级同步除非引入信令构造或显式障碍,否则数据更可能是而不是

下面是一个简单的例子:

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将始终输出"bar"作为A值,这不保证能够在弱同步行为的多处理器系统上(如Itanium),在这种情况下,可能会输出"foo"

+0

我不认为这个例子适用于这种情况。我认为CLR确保写入后再写入从不交换。 – Imran 2013-07-05 09:11:52

相关问题