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

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

基本上我很难理解这个:(来自 Bjarne FAQ)

However, most modern processors cannot read or write a single character, it must read or write a whole word, so the assignment to c really is ``read the word containing c, replace the c part, and write the word back again.'' Since the assignment to b is similar, there are plenty of opportunities for the two threads to clobber each other even though the threads do not (according to their source text) share data!

那么如果元素之间没有 3(7?)字节填充,字符数组怎么可能存在呢?

最佳答案

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

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

关于char 数组上的 C++ 内存模型和竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19903338/

相关文章:

c++ - 如何与命令 ld 链接

c++ - 从文件中读取和显示字符串

c++ - 包装类的完美转发

c++ - 从文件中读取第 11 列数字并取平均值?(c++)

c++11 - 基于std::vector的N维张量

Java 线程(竞争条件)

c++ - 从 double 转换为 float 时检测精度损失

c++ - 当您只能在运行时将基类向下转换为子类时,消除 C++ 虚函数

javascript - 尝试在注册服务 worker 之前运行获取功能。

javascript - React Typescript Conversion 问题渲染数据