"原子对象"的定义

thb*_*thb 22 c c++ atomic definition language-lawyer

在C和C++的标准术语,短语" 原子对象 "是指" 物体原子类型, "不是吗?

没有标准会明确定义每个双字短语,因此没有错误的C和C++标准,因为省​​略了这个短语的明确定义.然而,当我读到C++ 17标准(这里的草案)时,教派.4.7.1(4),即"所有的修改以使特定原子对象中号发生在一些特定的总次序,被称为修饰顺序中号 " -和当标准反复采用类似的语言来分隔以往更精确逻辑并发-I我想确保我不会无意中误解.

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

  • 对象原子类型

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

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

请问是哪一个?

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

参考:另见这个问题,我的问题是初步的.

bol*_*lov 18

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

但是,当您说"原子对象"时,您实际上是指一个对象,其公共接口仅公开原子操作,即您可以对该对象执行的所有操作都是原子操作.

在C和C++中,它们可能是以相反的方式定义的:首先定义原子对象,然后根据原子对象定义原子操作.

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

  • 不,这两个标准明确地和自愿地谈论原子对象.原子操作是处理原子对象的操作. (4认同)
  • @JensGustedt,C和C++以这种方式定义它可能是有意义的,因为标准的措辞主要涉及定义语言.从理论和抽象功能的角度来看,原子操作是主要关注点.重新回答了答案. (3认同)

eer*_*ika 7

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

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

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

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

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

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

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

  • 我可以想象一个可以在运行时更改其原子性的类型。不知道这是否是一件好事,但是通常他们会非常注意不要在不需要时限制标准的通用性。也许那就是没有“原子类型”而只有“原子对象”的原因 (2认同)
  • @ user463035818这可能就是为什么std :: atomic的成员被命名为[`is_always_lock_free`](https://en.cppreference.com/w/cpp/atomic/atomic/is_always_lock_free)的原因。还要注意:“原子类型有时也可以是无锁的,例如,如果在给定的体系结构上,只有对齐的内存访问自然是原子的,则相同类型的未对齐对象必须使用锁。” (2认同)