C++ 03中的并发内存模型是什么?
(而且,C++ 11是否会更改内存模型以更好地支持并发性?)
C++内存模型是关于何时以及为什么相对于C++代码读/写物理内存的规范.
在下一个C++标准之前,C++内存模型与C相同.在C++ 0x标准中,预计将包含用于多线程的适当内存模型(参见此处),它可能是下一个修订版的一部分C标准,C1X.目前的基础是初步的:
它仅指定当前程序可观察的内存操作的行为.
当多个进程访问同一个内存时(没有共享内存或进程的概念),它没有说明并发内存访问.
当多个线程访问相同的内存时(没有线程概念),它没有说明并发内存访问.
它无法指定内存访问的顺序(编译器优化包括代码运动和最近的处理器重新排序访问,两者都可以破坏模式,如双重检查初始化).
因此,当前状态是:C++内存操作仅在您有1个进程时指定,其主线程并且不编写依赖于变量读/写的特定顺序的代码,就是这样.从本质上讲,这意味着除了传统的你好世界计划之外你还搞砸了.
当然,你会立即添加"它今天在我的机器上工作,你不可能是正确的".正确的句子将是"它今天在我的机器上运行,具有硬件,操作系统(线程库)和编译器的特定组合,他们彼此了解得足以实现某些工作,但可能会在某些时候破坏".
好吧,这有点苛刻但是地狱,甚至Herb Sutter承认(只是阅读介绍)他正在谈论2007年最普遍的C/C++工具链之一的所有版本......
C++标准委员会试图提出一些能够解决所有这些问题的东西,同时仍然比Java的内存模型更少限制(从而表现更好).
汉斯·伯姆(Hans Boehm)在此收集了一些关于该问题的论文,包括学术论文和C++委员会.
看到其他一些答案,似乎很多C++程序员甚至都不知道你所询问的"内存模型"是什么意思.
问题是关于内存模型的意义:什么保证(如果有的话)有关于写/读重新排序(可能发生在编译器端或运行时端)?这个问题对于多线程编程非常重要,因为如果没有这样的规则编写正确的多线程程序是不可能的,并且有些令人惊讶的事实是当前缺乏显式内存模型许多多线程程序或多或少地"纯粹运气" - 大多数情况下归功于编译器假设跨函数调用的指针别名.- 请参阅线程无法实现为库
在当前的C++中,没有标准的内存模型.有些编译器为volatile变量定义了内存模型,但这是非标准的.C++ 0x为此目的定义了新的"原子"基元.可以在线程和C++内存模型中找到检查最近状态的详尽起点
重要的链接还有并发内存模型,原子类型和C++数据依赖性排序:原子和内存模型标准提议.