“原子对象”的定义

问题描述 投票:21回答:3

在C和C ++的标准术语中,短语“原子对象”的意思是“原子类型的对象”,它不是吗?

没有标准会明确定义每个双字短语,因此没有错误的C和C ++标准,因为省​​略了这个短语的明确定义。然而,当我读到C ++ 17标准(草案here)时,教派。 4.7.1(4),“对特定原子对象M的所有修改都以某种特定的总顺序出现,称为M的修改顺序” - 当标准重复使用类似的语言来划定更加精确的并发逻辑时 - I我想确保我不会无意中误解。

我是否正确地假设短语“原子对象”的意思

  • 原子类型的对象?

我能想象的唯一合理的选择是这个短语的意思

  • 正确对齐的对象足够小,硬件可以原子地处理它。

请问是哪一个?

(注意:我在C和C ++上都标记了这个问题,因为当涉及原子时,这两个标准使用几乎相同的语言。因此,就我所知,任何一种语言的专家都可以回答。如果由于某种原因,我是错了,那么请删除C标签并保留C ++。)

参考:另见this question,,我的问题是初步的。

c++ c language-lawyer atomic definition
3个回答
7
投票

C ++标准对原子对象([intro.races])上的操作和操作的效果施加了一组规则。如果对象上的所有操作都满足这些规则,那么该对象是原子的。

短语“原子对象”的意思是“原子类型的对象”,不是吗?

标准中没有措辞。但由于操作的效果取决于对象的类型,因此这不是一个不合理的结论。也相应地:原子类型是其实例是原子对象的类型。

C ++标准库提供了一组保证为原子的类型,以及保证为原子操作的那些类型的函数([atomics])。

正确对齐的对象足够小,硬件可以原子地处理它。

C ++标准没有指定原子对象的对齐或大小。

如果保证对象/类型是原子的(参见[atomics]),并且硬件对原子性有这样的要求,那么语言的实现必须保证满足这些要求,或者实现必须使用锁来强制执行原子性。


18
投票

在我看来,原子性 - 严格来说 - 不适用于类型或对象,它适用于操作,即你可以说操作是原子的或不是。

通过“原子对象”,我们理解一个对象,其公共接口仅公开原子操作,即您可以对该对象执行的所有操作都是原子操作。

在C和C ++中,可能是以相反的方式定义概念:首先定义原子对象,然后根据原子对象定义原子操作。 C和C ++以这种方式定义它可能是有意义的,因为标准的措辞主要涉及定义语言。然而,从理论和抽象功能的角度来看,原子操作是主要关注点。

C ++具有符合上述描述的标准std::atomic<T>类模板。


4
投票

我可以回答C,但C ++确实打算在这些点上与C同步。

是的,当C标准提到“原子对象”时,它表示具有原子限定的有效类型的对象。但它似乎也没有明确写下来,所以添加它可能是一个好主意。我会看到那个。

此外,除了一些人说,没有原子对象的C中没有原子操作。这是自发地修复的,这样对访问这些对象的原子性永远不会受到损害。

© www.soinside.com 2019 - 2024. All rights reserved.