📅  最后修改于: 2023-12-03 15:37:04.959000             🧑  作者: Mango
原子变量是在多线程编程中用于同步操作的一种数据类型。在 C11 标准中,标准库提供了 <stdatomic.h>
头文件用于定义和使用原子变量。
原子变量可以保证多个线程对它的操作是原子的(即不可分割的操作),从而避免线程间的竞争和数据的不一致性。
本文将介绍原子变量在 C 编程语言中的基本用法和注意事项。
定义原子变量需要使用 _Atomic
关键字,如下所示:
_Atomic int count;
常见的原子变量类型有以下几种:
_Atomic bool
:布尔类型_Atomic char
:字符类型_Atomic short
:短整数类型_Atomic int
:整数类型_Atomic long
:长整数类型_Atomic long long
:长长整数类型_Atomic float
:单精度浮点数类型_Atomic double
:双精度浮点数类型原子变量支持多种原子操作(atomic operation),可以通过下面的语法进行调用:
atomic_fetch_op(object, operand);
其中,object
表示原子变量,operand
表示操作数,fetch_op
表示操作类型,可以是以下几种:
add
:加法运算sub
:减法运算and
:按位与运算or
:按位或运算xor
:按位异或运算nand
:按位与非运算exchange
:交换变量的值compare_exchange_strong
:比较并交换变量的值(强版本)compare_exchange_weak
:比较并交换变量的值(弱版本)下面以 add
和 compare_exchange_strong
为例进行说明。
add
操作表示对原子变量进行加法运算。例如,假设原子变量 count
的初始值为 1,可以使用以下代码对其进行加 1 操作:
atomic_fetch_add(&count, 1);
compare_exchange_strong
操作表示比较并交换变量的值。例如,假设原子变量 count
的初始值为 1,可以使用以下代码进行比较并交换操作:
int expected = 1;
int newval = 2;
atomic_compare_exchange_strong(&count, &expected, newval);
在上面的代码中,只有当 count
的值等于 expected
时,才会将 count
的值替换为 newval
。如果 count
的值不等于 expected
,则操作不会进行。此外,返回值为 true
表示操作成功,返回值为 false
表示操作失败。