C++系列
Some Multi Thread
背景 早在单核时代,为了充分利用硬件的多发射和乱序执行能力,编译器就可能在编译期调整指令顺序。编译器重排与硬件乱序执行叠加后,硬件的实际执行顺序可能与源代码中的顺序存在偏差。不过,这些调整都遵循一个基本原则:从单线程的可观察行为来看,最终执行效果应当与顺序执行一致。 例如,对于下面的代码,如果两次写入之间不存在依赖关系,那么无论先写入 a 还是先写入 b,都不应影响后续指令的正确性。 a = 8; b = 9; 进入并发环境后,上述原则可以描述为:从线程自身来看,线程内代码的执行效果与顺序执行一致。编译器和硬件的优化都需要遵循这一原则,但这也从另一个角度说明:不同线程观察到的执行效果可能并不一致。 下面是一个经典示例。按照通常的直觉,我们可能认为:如果 R0 == 0,那么 Thread 0 应当已经执行完毕,而 Thread 1 还没有开始执行,因此 R1 一定等于 1。然而,在特定环境中,R0