具有内存障碍的Linux内核原子操作

时间:2016-07-10 05:38:34

标签: linux-kernel atomic memory-barriers

我正在努力更好地理解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);
}

0 个答案:

没有答案