全局共享计数器的实现
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_ONCE
和 WRITE_ONCE
,它们提供跨线程的基本可见性保证。当与 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_ONCE
和 WRITE_ONCE
,它们提供跨线程的基本可见性保证。当与 counter
的正确对齐相结合时,我认为它本质上等同于宽松的原子语义。