C语言中的原子类型是什么?

17

我记得在 C 语言中有一些称为原子类型的类型,但我们从未学习过它们。

那么,它们与常规类型(如 intfloatdoublelong 等)有何不同,以及它们有什么用途?


2
http://en.cppreference.com/w/c/language/atomic - Nezir
2个回答

20

原子类型是保证读写操作在单个指令中完成的类型。更多解释请参考gnu.org

24.4.7.2 原子类型

为了避免对变量的访问被中断时出现不确定性,可以使用一个特定的数据类型来保证访问始终是原子的: sig_atomic_t。保证读写这种数据类型在单个指令中完成,因此处理程序无法在访问“中间”运行。

类型 sig_atomic_t 总是一个整数数据类型,但其具体是哪种类型以及包含多少位数,则可能因机器而异。

数据类型:sig_atomic_t
这是一种整数数据类型。该类型的对象总是以原子方式访问。

实际上,您可以假设 int 是原子的。您也可以假设指针类型是原子的;这非常方便。对于GNU C库支持和POSIX系统我们知道的所有计算机,这两个假设都是正确的。

如需更多细节和一些C11特定的内容,请参阅CppReference.com(非关联网站)。


1
在8位机器上使用16位的int会发生什么?例如,您可以强制avr-gcc使用8位的int(-mint8),但默认情况下它们是16位的,占用两个相邻的字节,并且不是原子性的。 - iter
2
@iter 这其实是一个与我回答的问题(或一组问题)不同的问题。如果您想要问,请使用“提问”按钮。 - elixenide
这真的是离题了。我只是在想你引用中的最后一段话。 - iter
sig_atomic_t 不是原子类型。对于原子类型,可以使用 C11 _Atomic。在此之前,您应该使用 pthread_mutex_t 创建一个临界区来保护变量。有关详细信息,请参见此处 - Sam Protsenko
你不能假设int是原子的。https://github.com/alexeyneu/json-demo/blob/4dba1fd7463723311cb99b35d34c97d2740d42d3/decline/f.cpp#L67 - Алексей Неудачин

-2
这是一个针对IoS设备的答案。@stackoverflow Ed Cottrell的回答很好,但如果你想知道浮点数和双精度浮点数、整数和长整型之间的区别,那么这些类型使用不同的字节大小,双精度浮点数存储小数点数据,而有符号的则使用二进制补码表示负数,因此尝试将有符号类型转换为无符号类型。查找maxsize int long等信息。 要真正使用原子类型,您需要知道它们为什么被创建。读写汇编低级代码访问的需求与互斥锁、信号量和多核机器上的多线程相关。 这个想法是两个进程不能同时修改相同的数据。但我听说当两个进程尝试锁定内存位置或文件时,锁定会发生。因此,在Linux中,有一个NMI看门狗,可以扫描这些锁定。在我的单核机器上,我必须使用sudo sysctl kernel.nmi_watchdog=0来禁用它。
请尝试在维基百科上获取更多信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接