mirror of
https://github.com/changkun/modern-cpp-tutorial.git
synced 2025-12-16 20:27:08 +03:00
@@ -261,7 +261,7 @@ int main() {
|
||||
从直观上看,`t2` 中 `a = 5;` 这一条语句似乎总在 `flag = 1;` 之前得到执行,而 `t1` 中 `while (flag != 1)`
|
||||
似乎保证了 `std::cout << "b = " << b << std::endl;` 不会再标记被改变前执行。从逻辑上看,似乎 `b` 的值应该等于 5。
|
||||
但实际情况远比此复杂得多,或者说这段代码本身属于未定义的行为,因为对于 `a` 和 `flag` 而言,他们在两个并行的线程中被读写,
|
||||
出现了竞争。除此之外,即便我们忽略竞争读写,仍然可能收 CPU 的乱序执行,编译器对指令的重排的影响,
|
||||
出现了竞争。除此之外,即便我们忽略竞争读写,仍然可能受 CPU 的乱序执行,编译器对指令的重排的影响,
|
||||
导致 `a = 5` 发生在 `flag = 1` 之后。从而 `b` 可能输出 0。
|
||||
|
||||
### 原子操作
|
||||
|
||||
Reference in New Issue
Block a user