atomic_read实现

typedef struct {
	int counter;
} atomic_t;

static inline int atomic_read(const atomic_t *v)
{
	return ACCESS_ONCE((v)->counter);
}

#define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x))

ACCESS_ONCE 宏的目的是为了确保对 x 的访问(读取或写入)是不可分割的,也就是说,保证在读取或写入时,操作是原子的,不会被编译器的优化所影响。这通常用在多线程或者需要考虑中断的情况下,当你必须确保变量的值在被访问时没有被其他代码路径同时修改。

下面是对这个宏的解释:

  • *(volatile typeof(x) *)&(x):
    • typeof(x):取得变量 x 所代表的类型。
    • (volatile typeof(x) *):这段代码将 x 的地址转换为一个指向 typeof(x) 类型的 volatile 指针。volatile 关键字告诉编译器,每次访问这个变量时都需要从内存重新读取数据,这防止了编译器可能会做的任何优化,例如将变量值缓存在寄存器中。
    • &:取得变量 x 的地址。
    • *(...):对转换为 volatile 类型的指针进行解引用操作,即 获取该地址上的值。

因此,ACCESS_ONCE(x) 宏实际上在提供对 x 的直接访问,同时通过将其作为 volatile 类型来抑制编译器的优化行为。这在并发编程中非常重要,因为这样的操作有可能改变多个线程的行为。 English

请注意,ACCESS_ONCE 宏通常用于内核或嵌入式系统编程,在普通的应用程序中并不常见。此外,随着编译器和处理器模型的发展,可能需要更先进的同步机制(如内存栅栏或原子操作)来保证操作的原子性和内存的一致性。

相关推荐

  1. Spring WebSocket实现实时通信

    2024-03-23 17:52:01       56 阅读
  2. rsync+inotify实现实时同步

    2024-03-23 17:52:01       30 阅读
  3. 通讯录实现

    2024-03-23 17:52:01       63 阅读
  4. Promise实现

    2024-03-23 17:52:01       43 阅读
  5. SpringBoot集成etcd,实现实时监听,实现配置中心

    2024-03-23 17:52:01       63 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-23 17:52:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-23 17:52:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-23 17:52:01       82 阅读
  4. Python语言-面向对象

    2024-03-23 17:52:01       91 阅读

热门阅读

  1. Pytorch:torch.nn.functional.pad()

    2024-03-23 17:52:01       38 阅读
  2. 持续集成平台 02 jenkins plugin 插件

    2024-03-23 17:52:01       41 阅读
  3. 数学分析复习:指数函数的构造

    2024-03-23 17:52:01       38 阅读
  4. DataFrame:postgresql数据下载及上传

    2024-03-23 17:52:01       43 阅读
  5. 【PHP】通过PHP实时监控Apache、MySQL服务运行状态

    2024-03-23 17:52:01       36 阅读
  6. uniapp APP 上传文件

    2024-03-23 17:52:01       37 阅读
  7. Android设计模式

    2024-03-23 17:52:01       44 阅读
  8. 【函数式编程】柯里化和偏函数

    2024-03-23 17:52:01       39 阅读
  9. 腾讯面试准备-2024.3.21

    2024-03-23 17:52:01       31 阅读
  10. Vanilla Transformer

    2024-03-23 17:52:01       30 阅读
  11. 【Docker】在 Ubuntu 上安装 Docker 的步骤

    2024-03-23 17:52:01       38 阅读
  12. Python从入门到精通秘籍十五

    2024-03-23 17:52:01       41 阅读
  13. C语言可变参函数

    2024-03-23 17:52:01       36 阅读