- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这与 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/
这与 this question 有关. rmmh 在这个问题上的声明是,在某些架构上,不需要特殊的魔法来实现原子获取和设置。具体来说,在这种情况下,glib 中的 g_atomic_int_get(
glib a 提供 g_atomic_int_get 函数以原子方式读取标准 C int类型。从内存中将 32 位整数读取到寄存器中是否还不能保证是处理器的原子操作(例如 mov , )? 如果是,
在一段较大的代码中,我注意到 glib 中的 g_atomic_* 函数没有达到我的预期,所以我写了这个简单的例子: #include #include "glib.h" #include "pth
我是一名优秀的程序员,十分优秀!