基本上我无法理解这一点:(来自Bjarne FAQ)
但是,大多数现代处理器无法读取或写入单个处理器 字符,它必须读或写整个单词,所以赋值给c 真的是``读取包含c的单词,替换c部分,然后写 这个词又回来了。''因为对b的赋值是相似的,所以有 两个线程相互冲突的大量机会 虽然线程没有(根据他们的源文本)共享数据!
那么如何在元素之间没有3(7?)字节填充的情况下存在char数组?
答案 0 :(得分:8)
我觉得Bjarne错了,或者至少,他是
大大简化了事情。大多数现代处理器都是
能够写入一个字节而不先读完一个完整的单词,
或者说,他们表现得“好像”就是这种情况。在
特别是,如果你有char array[2];
,只有一个线程
访问array[0]
和线程二只访问array[1]
(包括当两个线程都在改变值时),那么你
不需要任何额外的同步;这是有保证的
按标准。如果硬件不直接允许,
编译器必须自己添加同步。
注意上面的“好像”是非常重要的。现代硬件 通过缓存行访问主内存,而不是字节。但它也 有修改缓存行中单个字节的规定,所以 回写时,处理器内核不会修改字节 尚未在其缓存中修改的内容。
答案 1 :(得分:6)
支持C ++ 11的平台必须能够访问大小为char
的存储而不会发明写入。 x86确实具备这种能力。如果处理器必须一次修改32位,则它必须具有32位宽char
。
(一些背景推理:数组是连续存储的,而字符没有填充(3.9.1)。)