char数组上的C ++内存模型和竞争条件

时间:2013-11-11 09:52:31

标签: c++ c++11 race-condition memory-model

基本上我无法理解这一点:(来自Bjarne FAQ)

  

但是,大多数现代处理器无法读取或写入单个处理器   字符,它必须读或写整个单词,所以赋值给c   真的是``读取包含c的单词,替换c部分,然后写   这个词又回来了。''因为对b的赋值是相似的,所以有   两个线程相互冲突的大量机会   虽然线程没有(根据他们的源文本)共享数据!

那么如何在元素之间没有3(7?)字节填充的情况下存在char数组?

2 个答案:

答案 0 :(得分:8)

我觉得Bjarne错了,或者至少,他是 大大简化了事情。大多数现代处理器都是 能够写入一个字节而不先读完一个完整的单词, 或者说,他们表现得“好像”就是这种情况。在 特别是,如果你有char array[2];,只有一个线程 访问array[0]和线程二只访问array[1] (包括当两个线程都在改变值时),那么你 需要任何额外的同步;这是有保证的 按标准。如果硬件不直接允许, 编译器必须自己添加同步。

注意上面的“好像”是非常重要的。现代硬件 通过缓存行访问主内存,而不是字节。但它也 有修改缓存行中单个字节的规定,所以 回写时,处理器内核不会修改字节 尚未在其缓存中修改的内容。

答案 1 :(得分:6)

支持C ++ 11的平台必须能够访问大小为char的存储而不会发明写入。 x86确实具备这种能力。如果处理器必须一次修改32位,则它必须具有32位宽char

(一些背景推理:数组是连续存储的,而字符没有填充(3.9.1)。)