首页 文章

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

提问于
浏览
5

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

但是,大多数现代处理器不能读取或写入单个字符,它必须读取或写入整个字,因此对c的赋值实际上是“读取包含c的单词,替换c部分,然后再将单词写回 . ''因为对b的赋值是相似的,所以即使线程没有(根据它们的源文本)共享数据,两个线程也有很多机会相互冲突!

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

2 回答

  • 6

    我认为Bjarne对此有误,或者至少,他正在大大简化事情 . 大多数现代处理器能够在不首先读取完整单词的情况下写入字节,或者更确切地说,它们的行为是"as if"就是这种情况 . 特别是,如果你有 char array[2]; ,并且线程1只访问 array[0] 而线程2只访问 array[1] (包括当两个线程都在改变值时),那么你不需要任何额外的同步;这是由标准保证的 . 如果硬件不直接允许,则编译器必须自己添加同步 .

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

  • 8

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

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

相关问题