我们在 C 中有原子 uint32 类型吗?

Do we have atomic uint32 type in C?

sig_atomic_tint 的类型定义。但我很好奇我们是否有一个与 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 位类型。

Ivan 的回答很好(我希望你接受他的,而不是这个),但值得一提的是一些编译器(我在看你,MSVC)不支持 C11 原子。

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

如果,OTOH,您需要一点可移植性,您可能想看看 atomic module in Portable Snippets(免责声明:这是我的项目之一,所以请对这个建议持保留态度)。没有 unsigned 32 位原子,但是有 32 位和 64 位 signed 原子类型可以很好地与 lot 个编译器,包括旧的(C11 之前的)GCC、clang 和 ICC,以及 suncc、ARM 和其他几个。