1
6
这似乎是语言规范的意图,在它自己的“原子”意义上,尽管它并没有完全用这些术语来描述。然而,您需要了解,规范的“原子”意义与C内存模型有关,而不一定与实现使用的CPU指令类型有关。
C定义所有格式良好
(C23 6.2.6.1/9) 我采用内存排序的规范来假设原子性。 此外,尽管简单赋值的规范没有具体说明此类赋值是“原子”执行的,但它们确实引用了6.2.6.1/9(在C23 6.5.17.1/2中)。此外,复合分配操作的规范说
(C23 6.5.17.3/4) 这不仅是对内存排序语义的另一种引用,而且“读-修改-写”是原子操作的术语,特别是在具有原子类型的左操作数的上下文中给出的。
语言规范没有这样的限制。正如你所观察到的,它
做
设置一个约束,即数组类型和函数类型不得
我想你的印象与对如何实现原子类型和操作的特定期望有关,但规范没有解决这个问题。然而,请注意,C明确允许在锁的帮助下(透明地)完成原子操作。为此,它允许原子类型的大小可能不同于其非原子对应物的大小,并提供功能
|
2
0
该标准假设程序不需要任何与原子或内存屏障相关的东西,除非它们的目标实现可以在需要时使用锁对任何大小的对象执行任何类型的原子操作,忽略了这样一个事实 有用的 支持这种语义可能需要了解编译器编写者不可能知道的目标环境,在某些目标上可能根本不可能。 GCC通过要求程序员提供函数来对任意大小的存储区域执行“原子”读取、写入和其他操作,从而解决了这个问题。如果程序员提供了按需运行的函数,原子操作将按指定执行。如果程序员不提供这样的函数,那么无论标准怎么说,实现都无法支持这样的语义。当针对标准假设不成立的平台时,这种处理方式可以说违背了标准的文字(标准的文字要求此类实现声称根本不支持原子操作),但支持确实存在的操作通常比放弃对原子的所有支持更有用。 |
Rasim Avcı · 如何履行承诺。解析需要原子化的代码 6 年前 |
Lingxi · 真正测试std::atomic是否无锁 6 年前 |
Rajeev Mehta · 修改和读取原子变量 6 年前 |
Chris Jefferson · 在Rust中获得“无序”语义 6 年前 |
Jérôme B · redis自动切换值 7 年前 |
krimog · 更新where select,保证原子性 7 年前 |