【发布时间】:2014-08-07 19:38:21
【问题描述】:
假设我有两个线程读取和修改 bool / int“状态”。处理器保证读取和写入是原子的。
Thread 1:
if (state == ENABLED)
{
Process_Data()
}
Thread 2:
state = DISABLED
在这种情况下,是的,线程 1 可以读取状态并进入 Process_Data 的“如果”,然后线程 2 可以更改状态。但在这一点上仍然继续处理 Process_Data 并没有错。是的,如果我们窥视引擎盖,我们会发现状态不一致,我们进入了 Process_Data 函数。但是在下一次执行 Thread1 后,它会得到 state = DISABLED 而不是 Process_Data。
我的问题是我是否仍然需要在这两个线程中加锁才能使 Thread1 的检查状态和进程原子化和 Thread2 的写入原子化(写入线程 1)?
【问题讨论】:
-
作为一般规则,从来没有*您会总是需要某些东西的情况。 (*从不,作为另一个绝对,通常是错误的。)这真的取决于你的用例。正如您已经说过的,当
state实际上是DISABLED时,您不介意运行Process_Data,因此您不需要锁。当然,这是假设Process_Data不会与线程 2 上发生的任何事情发生冲突。 -
"Atomic by the processor" 只是意味着“不会发生撕裂的读/写”。这与内存可见性无关(阅读缓存一致性)。
-
state = DISABLED,没有任何编译器或硬件障碍,可能会导致线程 1 永远不会看到线程 2 执行state = DISABLED的效果
标签: multithreading thread-safety race-condition