最近我查看了Linux内核实现原子读写的代码,然后出现了一些问题。
首先是ia64架构下的相关代码:
typedef struct {
int counter;
} atomic_t;
#define atomic_read(v) (*(volatile int *)&(v)->counter)
#define atomic64_read(v) (*(volatile long *)&(v)->counter)
#define atomic_set(v,i) (((v)->counter) = (i))
#define atomic64_set(v,i) (((v)->counter) = (i))
针对读写操作,似乎采用了直接访问变量的方法。除非在其他地方做了一些魔法,否则我无法理解在汇编领域中这个操作如何保证原子性。或许一个显而易见的答案是这个操作会转换成一个汇编指令,但即使这样,在考虑到不同的内存缓存级别(或者其他优化)时,这还有什么保障呢?
在读取宏定义中,使用了一个强制类型转换技巧来使用volatile类型。有人知道这对原子性有什么影响吗?(注意在写入操作中没有使用该类型)