我们在C中有原子ui​​nt32类型吗?

时间:2018-04-04 23:37:03

标签: c atomic c11

sig_atomic_tint的typedef。但我很好奇我们是否有一个与uint32_t匹配的原子类型?

2 个答案:

答案 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_tatomic_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和其他一些。