以下代码来自(清单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
呢?我看不出如何保证它不会发生。所以你怎么看?就我的怀疑而言,该实现是否正确?为什么?
答案 0 :(得分:2)
不确定您所指的文档版本,但是latest one中的图5.3使用宏READ_ONCE
和WRITE_ONCE
,它们提供了跨线程的基本可见性保证。当与counter
的适当对齐方式结合使用时,我想它基本上等同于宽松的原子语义。