在最常见的平台上(最重要的是 x86;我知道有些平台的内存模型非常困难,几乎不能保证对多线程有用,但我不关心罕见的反例),下面的代码安全吗?
线程 1:
someVariable = doStuff();
atomicSet(stuffDoneFlag, 1);
线程 2:
while(!atomicRead(stuffDoneFlag)) {} // Wait for stuffDoneFlag to be set.
doMoreStuff(someVariable);
假设原子操作的标准、合理实现:
- 线程 1 的分配是否保证在被调用
someVariable
之前完成?atomicSet()
- 如果线程 2 以原子方式读取,是否保证
someVariable
在调用之前看到分配?doMoreStuff()
stuffDoneFlag
编辑:
- 我正在使用的原子操作的实现
LOCK
在每个操作中都包含 x86 指令,如果有帮助的话。 - 假设
stuffDoneFlag
以某种方式正确清除。怎么样并不重要。 - 这是一个非常简化的例子。我以这种方式创建它,这样您就不必了解问题的整个背景来回答它。我知道它没有效率。