c++ - 并发的 C++03 内存模型是什么?

标签 c++ concurrency c++03 memory-model

C++03中并发的内存模型是什么?

(而且,C++11 是否更改了内存模型以更好地支持并发?)

最佳答案

C++ 内存模型是针对 C++ 代码读取/写入物理内存的时间和原因的规范。

在下一个 C++ 标准之前,C++ 内存模型与 C 相同。在 C++0x 标准中,预计将包含一个适合多线程的内存模型(参见 here),并将成为其中的一部分可能是 C 标准的下一个修订版,C1X。当前的一个是简陋的:

  • 它只指定当前程序可观察到的内存操作的行为。
  • 当多个进程访问同一内存时,它没有说明并发内存访问(没有共享内存或进程的概念)。
  • 当多个线程访问同一内存时,它没有说明并发内存访问的任何内容(没有线程的概念)。
  • 它无法指定内存访问的顺序(编译器优化包括代码移动和最近的处理器重新排序访问,两者都可能破坏模式,例如双重检查初始化)。

因此,当前状态是:仅当您有 1 个进程、其主线程且不编写依赖于变量读/写的特定顺序的代码时才指定 C++ 内存操作,仅此而已。从本质上讲,这意味着除了传统的 hello world 程序之外,您已经完蛋了。

当然,系统会提示您添加 “它今天在我的机器上运行,你不可能是对的”。正确的句子应该是 “它今天可以在我的机器上使用这种特定的硬件、操作系统(线程库)和编译器组合,它们彼此了解足够多,可以实现一些有点工作但可能会在某些时候中断的东西".

好吧好吧,这有点苛刻,但是 hell ,even Herb Sutter acknowledges that (只需阅读介绍),他正在谈论最普遍的 C/C++ 工具链之一的所有 2007 年前版本...

C++ 标准委员会试图提出一些可以解决所有这些问题的方法,同时仍然比 Java 的内存模型限制更少(因此性能更好)。

Hans Boehm 收藏了 here一些关于这个问题的论文的指针,包括学术论文和 C++ 委员会的论文。

关于c++ - 并发的 C++03 内存模型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/220752/

相关文章:

c++ - 我可以使用模板来设置数组大小吗?

c++ - 错误 C2220 : warning treated as error-no 'object' file generated in driver development

c++ - 多重但唯一的类继承

c++ - 使用类对象提升线程 worker

c++ - 在旧的 C++ 标准中,我可以使用什么来代替 std::string::pop_back?

c++ - 是否存在与用于 Java 的 Google Gson/XStream 一样简单的 C++ 序列化库?

python - 异步 : running task only if all other tasks are awaiting

java - 使用多个并发线程执行一组测试方法

c++ - 用于恢复先前值的 RAII 对象

c++ - 静态类成员是否保证在调用 `main` 之前被初始化?