实施全球共享柜台

时间:2019-05-05 12:44:43

标签: concurrency x86 memory-barriers

以下代码来自(清单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呢?我看不出如何保证它不会发生。所以你怎么看?就我的怀疑而言,该实现是否正确?为什么?

1 个答案:

答案 0 :(得分:2)

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