我正在努力更好地理解Linux内核中的内存障碍。我想知道如果这些线程并行运行,下面的实现是否会导致有效的原子操作。我并不关注这个实现中的特定架构......我希望这适用于任何架构。基本上我的实现在任何写操作之后都有一个smp_mb()和任何读操作之前的barrier()。如果这个实现不起作用,它是否适用于具有一个或多个读取器线程的单个编写器线程?
int a = 0;
int *b = &a;
int c;
#define my_atomic_set(var, val) { \
*var = val; \
smp_mb(); \
}
#define my_atomic_set_ret(var, val) { \
barrier(); \
int ret = *var; \
*var = val; \
smp_mb(); \
ret;
}
#define my_atomic_add(var, val) { \
barrier(); \
int tmp = *var; \
*var = tmp + val; \
smp_mb(); \
}
#define my_atomic_get(var) { \
barrier(); \
*var; \
}
void thread1_func() {
my_atomic_add(b, 1);
my_atomic_set(b, 2);
}
void thread2_func() {
my_atomic_set(b, 3);
my_atomic_add(b, 4);
}
void thread3_func() {
c = my_atomic_get(b);
c = my_atomic_set_ret(b, 10);
}
void thread4_func() {
c = my_atomic_get(b);
c = my_atomic_get(b);
}