【发布时间】:2012-03-06 13:12:27
【问题描述】:
最近我窥探了原子读写的 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 类型用于强制转换技巧。任何人都知道这如何影响这里的原子性? (注意在写操作中不使用)
【问题讨论】:
标签: c linux-kernel atomic volatile