atomic在linux编译不通过,内存障碍和在linux上的atomic_t

最近我正在阅读一些

Linux内核空间代码,我看到了这一点

uint64_t used;

uint64_t blocked;

used = atomic64_read(&g_variable->used); //#1

barrier(); //#2

blocked = atomic64_read(&g_variable->blocked); //#3

这段代码片段的语义是什么?确保#1在#3之前执行#2.

可是,我是一个乱七八糟的人,因为这样

#A在64位平台中,将atomic64_read宏扩展为

used = (&g_variable->used)->counter // where counter is volatile.

在32位平台中,它被转换为使用锁cmpxchg8b.我假设这两个具有相同的语义,对于64位版本,我认为这意味着:

>全部或全部,我们可以排除地址不对齐,字长大于CPU本机字大小的情况.

>无优化,强制CPU从内存位置读取.

atomic64_read没有保留读取顺序的语义!见this

#B屏障宏定义为

/* Optimization barrier */

/* The "volatile" is due to gcc bugs */

#define barrier() __asm__ __volatile__("": : :"memory")

从wiki this起只是防止gcc编译器重新排序读写.

我困惑的是如何禁用CPU的重新排序优化?另外,我可以想到屏障宏是全面的?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值