最近我正在阅读一些
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的重新排序优化?另外,我可以想到屏障宏是全面的?