我记得在 C 语言中有一些称为原子类型的类型,但我们从未学习过它们。
那么,它们与常规类型(如 int
、float
、double
、long
等)有何不同,以及它们有什么用途?
原子类型是保证读写操作在单个指令中完成的类型。更多解释请参考gnu.org:
24.4.7.2 原子类型
为了避免对变量的访问被中断时出现不确定性,可以使用一个特定的数据类型来保证访问始终是原子的:
sig_atomic_t
。保证读写这种数据类型在单个指令中完成,因此处理程序无法在访问“中间”运行。类型
sig_atomic_t
总是一个整数数据类型,但其具体是哪种类型以及包含多少位数,则可能因机器而异。数据类型:
sig_atomic_t
这是一种整数数据类型。该类型的对象总是以原子方式访问。实际上,您可以假设
int
是原子的。您也可以假设指针类型是原子的;这非常方便。对于GNU C库支持和POSIX系统我们知道的所有计算机,这两个假设都是正确的。
如需更多细节和一些C11特定的内容,请参阅CppReference.com(非关联网站)。
int
会发生什么?例如,您可以强制avr-gcc
使用8位的int
(-mint8),但默认情况下它们是16位的,占用两个相邻的字节,并且不是原子性的。 - itersig_atomic_t
不是原子类型。对于原子类型,可以使用 C11 _Atomic
。在此之前,您应该使用 pthread_mutex_t
创建一个临界区来保护变量。有关详细信息,请参见此处。 - Sam Protsenko