一直有人告诉我在多个线程将访问的变量周围设置锁,我一直认为这是因为您要确保在写回该变量之前,所使用的值没有改变
IE。
mutex.lock()
int a = sharedVar
a = someComplexOperation(a)
sharedVar = a
mutex.unlock()
这很有意义,您可以锁定它。但是在其他情况下,我不明白为什么不使用互斥体无法摆脱困境。
线程A:
sharedVar = someFunction()
线程B:
localVar = sharedVar
在这种情况下可能会出什么问题?特别是如果我不在乎线程B会读取线程A分配的任何特定值。
最佳答案
这很大程度上取决于sharedVar
的类型,您使用的语言,任何框架和平台。在许多情况下,将单个值分配给sharedVar
可能会花费一条以上的指令,在这种情况下,您可能会读取该值的“半集”副本。
即使不是这种情况,并且分配是原子的,但如果没有memory barrier,您也可能看不到最新值。