我们在 C 中有原子 uint32 类型吗?
Do we have atomic uint32 type in C?
sig_atomic_t
是 int
的类型定义。但我很好奇我们是否有一个与 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_t
、atomic_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 和其他几个。
sig_atomic_t
是 int
的类型定义。但我很好奇我们是否有一个与 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_t
、atomic_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 和其他几个。