📜  原子变量 - C 编程语言(1)

📅  最后修改于: 2023-12-03 15:37:04.959000             🧑  作者: Mango

原子变量 - C 编程语言

简介

原子变量是在多线程编程中用于同步操作的一种数据类型。在 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:比较并交换变量的值(弱版本)

下面以 addcompare_exchange_strong 为例进行说明。

add

add 操作表示对原子变量进行加法运算。例如,假设原子变量 count 的初始值为 1,可以使用以下代码对其进行加 1 操作:

atomic_fetch_add(&count, 1);
compare_exchange_strong

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 表示操作失败。