2015-11-04 69 views
0

我不熟悉多线程和锁以及原子/非原子操作。如何解释多线程环境下的读/写全局变量

最近我看到一个面试问题如下。

f1f2分别放在两个不同的线程中并且同时运行它们,当它们都返回时,a的值是多少?

int a = 2, b = 0, c = 0 
func f1() 
{ 
    a = a * 2 
    a = b 
} 
func f2() 
{ 
    c = a + 11 
    a = c 
} 

我试图实现的目标C环境上面的代码和我得到的是a = 11。我不确定这是否正确,因为我所做的是将f1放在主队列中,并将f2放入调度全局队列中,并运行它可能不正确的异步。

如果有人能够根据register accessing,CPU processing,memory usage的等级给出答案并解释过程,那就太好了。

回答

0

答案是--A的结果是随机的。它可以是任何东西。由于对A的访问不是原子性的,并且没有同步,因此取决于随机因素,不同的线程可能会看到不同的值。如果你设法使一个未对齐的并在X86上运行它,你甚至可能会看到一个非价值的。