Atomic Operations (standardized memory model)
C ++规范未引用任何特定的编译器,操作系统或CPU。它引用了 abstract machine 抽象机,它是对实际系统的概括。 在语言规范中,程序员的工作是为抽象机编写代码。编译器的工作是在具体机器上实现该代码。通过严格按照规范进行编码,可以确定您的代码可以在不使用兼容C ++编译器的任何系统上进行编译和运行,而无论是现在还是50年后。 C ++ 98 / C ++ 03规范中的抽象机基本上是单线程的。因此,不可能编写相对于规范“完全可移植”的多线程C ++代码。规范甚至没有说关于内存加载和存储的原子性或加载和存储可能发生的顺序的任何事情,不用管互斥锁之类的事情。 当然,您可以在实践中为特定的具体系统(例如pthread或Windows)编写多线程代码。但是没有标准的方法可以为C ++ 98 / C ++ 03编写多线程代码。 C ++ 11中的抽象机在设计上是多线程的。它还具有定义明确的内存模型;也就是说,它说明了在访问内存时编译器可能会做什么,可能不会做什么。 考虑以下示例,其中两个线程同时访问一对全局变量: 线程2可能输出什么? 在C ++ 98 / C ++ 03下,这甚至不是“未定义行为”;这个问题本身是没有意义的,因为该标准并未考虑任何被称为“线程”的东西。 在C ++ 11下,结果是未定义行为,因为加载和存储通常不需要是原子的。看起来似乎并没有太大的改善