如何解释Read/Write 多线程环境下的全局变量
How to explain Read/Write global variables in multi threads environment
我不熟悉多线程和锁以及atomic/nonatomic操作。
最近看到一道面试题如下。
把f1
和f2
放在两个单独的线程中,同时运行它们,当它们都return时,[=的值是多少? 14=]?
int a = 2, b = 0, c = 0
func f1()
{
a = a * 2
a = b
}
func f2()
{
c = a + 11
a = c
}
我尝试在objective c环境下实现上面的代码,得到的是a = 11
。我不确定这是否正确,因为我所做的是将 f1
放在主队列中并将 f2
放在调度全局队列中,而 运行 它是异步的,这可能是不正确的。
如果有人能按照register accessing
、CPU processing
、memory usage
的水平给出答案并说明流程就好了
答案是 - A 的结果是随机的。它可以是任何东西。由于对 A 的访问不是原子的并且没有同步,因此不同的线程可能会看到不同的 a 值,具体取决于随机因素。如果您设法在 X86 上创建未对齐的 运行 ,您甚至可能会看到 a.
的非值
我不熟悉多线程和锁以及atomic/nonatomic操作。
最近看到一道面试题如下。
把f1
和f2
放在两个单独的线程中,同时运行它们,当它们都return时,[=的值是多少? 14=]?
int a = 2, b = 0, c = 0
func f1()
{
a = a * 2
a = b
}
func f2()
{
c = a + 11
a = c
}
我尝试在objective c环境下实现上面的代码,得到的是a = 11
。我不确定这是否正确,因为我所做的是将 f1
放在主队列中并将 f2
放在调度全局队列中,而 运行 它是异步的,这可能是不正确的。
如果有人能按照register accessing
、CPU processing
、memory usage
的水平给出答案并说明流程就好了
答案是 - A 的结果是随机的。它可以是任何东西。由于对 A 的访问不是原子的并且没有同步,因此不同的线程可能会看到不同的 a 值,具体取决于随机因素。如果您设法在 X86 上创建未对齐的 运行 ,您甚至可能会看到 a.
的非值