gpt4 book ai didi

c - g_atomic_int_get 保证对另一个线程的可见性?

转载 作者:行者123 更新时间:2023-12-01 13:01:26 25 4
gpt4 key购买 nike

这与 this question 有关.

rmmh 在这个问题上的声明是,在某些架构上,不需要特殊的魔法来实现原子获取和设置。具体来说,在这种情况下,glib 中的 g_atomic_int_get(&foo) 被简单地扩展为 (*(&foo))。我知道这意味着 foo 不会处于内部一致的状态。但是,我是否也保证 foo 不会被给定的 CPU 或内核缓存?

具体来说,如果一个线程正在设置 foo,而另一个线程正在读取它(使用 glib g_atomic_* 函数),我是否可以假设读者将看到作者对变量所做的更新。或者作者是否可以简单地更新寄存器中的值?作为引用,我的目标平台是多核多 CPU X86_64 机器上的 gcc (4.1.2)。

最佳答案

大多数架构确保(包括)的是适当大小和对齐的读/写的原子性和读写一致性(因此每个处理器都会看到给定内存地址(*)的相同主值序列的子序列),和 int 最有可能是合适的大小,编译器通常会确保它们也正确对齐。

但是编译器很少确保它们不会优化某些未以某种方式标记的读取或写入。我试过编译:

int f(int* ptr)
{
int i, r=0;
*ptr = 5;
for (i = 0; i < 100; ++i) {
r += i*i;
}
*ptr = r;
return *ptr;
}

在 gcc 4.1.2 中,gcc 优化了第一次写入 *ptr 时没有问题,这是您可能不希望原子写入的内容。

(*) 不要将连贯性与一致性混淆:不同地址的读写之间的关系对于直观但实现起来成本高昂的顺序一致性而言通常是放松的。这就是需要内存屏障的原因。

关于c - g_atomic_int_get 保证对另一个线程的可见性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5732749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com