我们是否有原子UINT32类型



sig_atomic_tint的Typedef。但是我很好奇我们有一种与uint32_t匹配的原子类型吗?

c11在 <stdatomic.h>中的原子类型定义了以下类型:

atomic_bool
atomic_char
atomic_schar
atomic_uchar
atomic_short
atomic_ushort
atomic_int
atomic_uint
atomic_long
atomic_ulong
atomic_llong
atomic_ullong
atomic_char16_t
atomic_char32_t
atomic_wchar_t
atomic_int_least8_t
atomic_uint_least8_t
atomic_int_least16_t
atomic_uint_least16_t
atomic_int_least32_t
atomic_uint_least32_t
atomic_int_least64_t
atomic_uint_least64_t
atomic_int_fast8_t
atomic_uint_fast8_t
atomic_int_fast16_t
atomic_uint_fast16_t
atomic_int_fast32_t
atomic_uint_fast32_t
atomic_int_fast64_t
atomic_uint_fast64_t
atomic_intptr_t
atomic_uintptr_t
atomic_size_t
atomic_ptrdiff_t
atomic_intmax_t
atomic_uintmax_t

没有atomic_uint32_t,因此您的选择是:

  • 您可以直接使用_Atomic(uint32_t)
  • 如果适合您的目的(可能不是(,则可以使用现有的替代类型之一(atomic_uint_least32_tatomic_uint_fast32_t甚至atomic_char32_t(。
  • 您可以假设atomic_uint是32位,并将其用作替代品。这实际上应该是最便携的方式之一,因为大多数OS(*BSD,Linux,Windows(假设int是32位类型。

标准不会定义具有精确尺寸的原子类型,因为平台可能无法原子处理精确的大小。即使系统具有uint32_t类型,它可能无法使用该类型进行原子处理操作,但也许只能使用uint64_t类型来处理,这就是为什么只有uint_least32_t,这可以保证您可以肯定的类型可用,但可用32位可用,但是如果平台需要原子操作,也可以将其映射到uint64_t

标准确实允许您使用_Atomic(uint32_t),但是即使在这种情况下,也不能保证它会导致具有恰好32位的类型,而是可以免费映射到与请求的类型和最接近的类型和确实允许原子操作,这同样可以是某个平台上的uint64_t

请注意,C标准本身永远无法保证存在确切类型的存在,例如uint32_t。这些类型是可选的。只有POSIX标准需要这些确切类型的存在,但POSIX标准不需要它们是原子。

ivan的答案很棒(我希望您接受他的答案,而不是这个(,但是值得一提的是,某些编译器(我在看着您,MSVC(不支持C11 Atomics。

如果您不关心此类编译器,请使用C11 Atomics。

如果,OTOH,您需要一些可移植性,则可能需要看一下便携式摘要中的原子模块(免责声明:这是我的项目之一,所以用盐分添加盐(。没有 32位原子,但是有32-和64位签名的原子类型,它们与编译器的 lot 一起工作,包括旧的(前C11(GCC,Clang和ICC,以及Suncc,Arm和其他一些。

最新更新