2020年3月17日 下午5:24
并发代码1
1 | x = 0; |
并发代码2:
1 | x = 1; |
并发代码3
1 | if (y == 2) { |
总结:

当 1 + 3 并发时—>可以解决的问题,结果是确定的
我们可以用原子操作的内存顺序来解决:
1 | x = 1; |
1 | if (y.load(memory_order_acquire) == 2) { |
我们可以用下图示意一下,每一边的代码都不允许重排越过黄色区域,且如果 y 上的释放早于 y 上的获取的话,释放前对内存的修改都在另一个线程的获取操作后可见
当1 + 2并发时—>不论采用哪种方式解决,结果都是不确定的
- 你只能保证并发代码1, 并发代码2各自是禁止交换顺序
- 你无法避免保证1 + 2并发,线程的交叉执行,所以,结果一定是不确定的!