c++ - C++11 内存模型是否可以防止内存撕裂和冲突?

标签 c++ multithreading thread-safety c++11

阅读 C++11 的草稿,我对第 1.7.3 条感兴趣:

A memory location is either an object of scalar type or a maximal sequence of adjacent bit-fields all having non-zero width. ... Two threads of execution (1.10) can update and access separate memory locations without interfering with each other.

此条款是否可以防止与硬件相关的竞争条件,例如:

  • 在两个总线事务中更新内存的未对齐数据访问(内存撕裂)?
  • 系统内存单元中有不同的对象,例如一个 32 位字中的两个 16 位有符号整数,并且单独对象的每个独立更新都需要写入整个内存单元(内存冲突)?

最佳答案

关于第二点,标准保证那里不会有比赛。话虽这么说,但有人告诉我,这种保证在当前的编译器中并未实现,甚至可能无法在某些体系结构中实现。

关于第一点,如果第二点可以保证,如果你的程序不包含任何竞争条件,那么自然的结果是这也不会是竞争条件。也就是说,假设写入不同子字位置的标准 保证 是安全的,那么唯一可能出现竞争条件的情况是多个线程访问同一个变量(即拆分跨单词,或者更可能是跨缓存行有问题)。

同样,这可能很难甚至不可能实现。如果您的未对齐数据穿过缓存行,那么在不对性能造成巨大成本的情况下几乎不可能保证代码的正确性。出于这个原因和其他原因,您应该尽可能避免未对齐的变量(包括原始性能,写入触及两个缓存行的对象涉及向内存写入多达 32 个字节,并且如果任何其他线程正在触及任何缓存行,它还涉及缓存同步的成本......

关于c++ - C++11 内存模型是否可以防止内存撕裂和冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10897093/

相关文章:

C++ dll循环问题

ios - 是否建议在 iOS 的另一个后台线程中启动一个后台线程

java - 如果我们有足够的处理器来服务所有线程,Thread.yield() 会做任何事情吗?

java - 在多线程和高负载场景下使用java file io好吗?

c# - 如何创建一个连续循环的线程/任务?

c++ - 模版参数的模糊模版重载是一个容器

c++ - QT中的透明小部件

C++,Windows 7 : recognize usb thumbdrive was connected and recognize usb identifier?

java - 应该在微服务中使用多线程吗?

ios - 执行选择器 :withObject:afterDelay: -- can I be certain that this is run on the main thread?