为什么穿线危险?

Why*_*ing 3 multithreading

我总是被告知要对多个线程将访问的变量进行锁定,我一直认为这是因为你要确保在你写回来之前你正在使用的值没有改变,即

mutex.lock()
int a = sharedVar
a = someComplexOperation(a)
sharedVar = a
mutex.unlock()
Run Code Online (Sandbox Code Playgroud)

你有理由把它锁定.但在其他情况下,我不明白为什么我不能不使用互斥锁.

线程A:

sharedVar = someFunction()
Run Code Online (Sandbox Code Playgroud)

线程B:

localVar = sharedVar
Run Code Online (Sandbox Code Playgroud)

在这种情况下可能出现什么问题?特别是如果我不关心线程B读取线程A分配的任何特定值.

Ree*_*sey 5

它在很大程度上取决于sharedVar您使用的语言类型,任何框架和平台.在许多情况下,分配单个值sharedVar可能需要多个指令,在这种情况下,您可能会读取该值的"半集"副本.

即使不是这种情况,并且赋值是原子的,如果没有内存屏障,您可能看不到最新值.