sig_atomic_t
是int
的typedef。但我很好奇我们是否有一个与uint32_t
匹配的原子类型?
答案 0 :(得分:4)
C11在<stdatomic.h>
中定义了以下typedef到原子类型:
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位并将其用作替代品。这实际上应该是最便携的方式之一,因为大多数操作系统(* BSD,Linux,Windows)都认为int
是32位类型。答案 1 :(得分:1)
Ivan的答案很棒(我希望你接受他,而不是这个),但值得一提的是,有些编译器(我在看你,MSVC)不支持C11原子。
如果您不关心此类编译器,请使用C11 atomics。
如果,OTOH,您需要一点便携性,您可能需要查看atomic module中的Portable Snippets(免责声明:这是我的项目之一,所以请将此建议与盐)。没有无符号 32位原子,但有32位和64位签名原子类型,与编译器的批次配合良好,包括旧的(前C11)GCC,clang和ICC,以及suncc,ARM和其他一些。