全局共享计数器的实现

Implementation of global shared counter

以下代码来自(清单5.3): Is Parallel Programming Hard, And, If So, What Can You Do About It?

DEFINE PER_THREAD(long, counter);

void inc_count(void){
  __get_thread_var(counter)++; // __get_thread_var returns a reference to thread local counter.  
}

long read_count(void){
    int t;
    long sum = 0;

    for_each_thread(t)
       sum += per_thread(counter, t);
    return sum;
}

以上代码实现了一个全局(由核心共享)计数器。显然,我们可以改用原子操作。但是,我们考虑更新非常频繁的情况,因此我们需要一个每线程变量来最小化 CPU 系统上的流量。

我不明白为什么它是正确的。毕竟,在 C/C++/Java 中,我们最多有 SC-DRF(如果没有数据竞争,则为顺序一致性)。

实际上,我们有一个数据竞赛。因此,我们无法从内存模型中得到保证。特别是 Out Of Air Thin values 呢?我看不出如何保证它不会发生。所以你怎么看?就我的疑问而言,该实施是否正确,为什么?

不确定您指的是哪个版本的文档,但 latest one 中的图 5.3 使用了宏 READ_ONCEWRITE_ONCE,它们提供跨线程的基本可见性保证。当与 counter 的正确对齐相结合时,我认为它本质上等同于宽松的原子语义。