C语言中的原子类型是什么?
What are atomic types in the C language?
我记得我在 C 语言中遇到过某些类型,称为原子类型,但我们从未研究过它们。
那么,它们与 int
、float
、double
、long
等常规类型有何不同,它们的用途是什么?
原子类型是保证在一条指令中进行读取和写入的类型。来自 gnu.org 的更多解释:
24.4.7.2 Atomic Types
To avoid uncertainty about interrupting access to a variable, you can
use a particular data type for which access is always atomic:
sig_atomic_t
. Reading and writing this data type is guaranteed to
happen in a single instruction, so there’s no way for a handler to run
“in the middle” of an access.
The type sig_atomic_t
is always an integer data type, but which one it
is, and how many bits it contains, may vary from machine to machine.
Data Type: sig_atomic_t
This is an integer data type. Objects of this
type are always accessed atomically.
In practice, you can assume that int
is atomic. You can also assume
that pointer types are atomic; that is very convenient. Both of these assumptions are true on all of the machines that the GNU C Library supports and on all POSIX systems we know of.
有关更多详细信息和一些特定于 C11 的内容,请查看 CppReference.com(无从属关系)。
这是 IoS 机器的答案。 @Whosebug
Ed Cottrells 的回答很好,但如果你想知道浮点数和双精度整数和长整数之间的区别。这些类型使用不同的字节大小双浮点数存储小数的基数数据。 signed 使用二进制补码向后存储负数,因此请尝试将 signed 转换为 unsigned 类型。 Look up maxsize int long etc.
要真正使用原子类型,您需要知道创建它们的原因。读写程序集低级编码访问的需求与多核机器上的互斥锁信号量和多线程有关。
我们的想法是两个进程不应该能够同时修改相同的数据。但是我听说当两个进程试图锁定一个内存位置或文件时,就会发生锁锁。所以在 linux 中有 NMI 看门狗被黑客攻击以扫描这些锁。在我的单核机器上,我必须使用 sudo sysctl kernel.nmi_watchdog=0.
禁用它
尝试维基百科了解更多信息
我记得我在 C 语言中遇到过某些类型,称为原子类型,但我们从未研究过它们。
那么,它们与 int
、float
、double
、long
等常规类型有何不同,它们的用途是什么?
原子类型是保证在一条指令中进行读取和写入的类型。来自 gnu.org 的更多解释:
24.4.7.2 Atomic Types
To avoid uncertainty about interrupting access to a variable, you can use a particular data type for which access is always atomic:
sig_atomic_t
. Reading and writing this data type is guaranteed to happen in a single instruction, so there’s no way for a handler to run “in the middle” of an access.The type
sig_atomic_t
is always an integer data type, but which one it is, and how many bits it contains, may vary from machine to machine.Data Type:
sig_atomic_t
This is an integer data type. Objects of this type are always accessed atomically.In practice, you can assume that
int
is atomic. You can also assume that pointer types are atomic; that is very convenient. Both of these assumptions are true on all of the machines that the GNU C Library supports and on all POSIX systems we know of.
有关更多详细信息和一些特定于 C11 的内容,请查看 CppReference.com(无从属关系)。
这是 IoS 机器的答案。 @Whosebug
Ed Cottrells 的回答很好,但如果你想知道浮点数和双精度整数和长整数之间的区别。这些类型使用不同的字节大小双浮点数存储小数的基数数据。 signed 使用二进制补码向后存储负数,因此请尝试将 signed 转换为 unsigned 类型。 Look up maxsize int long etc.
要真正使用原子类型,您需要知道创建它们的原因。读写程序集低级编码访问的需求与多核机器上的互斥锁信号量和多线程有关。
我们的想法是两个进程不应该能够同时修改相同的数据。但是我听说当两个进程试图锁定一个内存位置或文件时,就会发生锁锁。所以在 linux 中有 NMI 看门狗被黑客攻击以扫描这些锁。在我的单核机器上,我必须使用 sudo sysctl kernel.nmi_watchdog=0.
禁用它尝试维基百科了解更多信息