我正在设计一个多线程算法,其中的要求是读取共享变量的最新值。对变量的写入是原子的(使用比较和交换)。但是,读取不是原子的。
考虑以下示例:
//Global variable
int a = 10;
// Thread T1
void func_1() {
__sync_bool_compare_and_swap(&a, 10, 100);
}
// Thread T2
void func_2() {
int c = a;
/* Some Operations */
int b = a;
/* Some Operations */
}
如果代码 int b = a
是在 func_1 中的 __sync_bool_compare_and_swap
之后(由线程 T2)执行的(由线程 T2),那么根据我的理解,它仍然是不能保证读取“变量 a”的最新值,因为编译器可以缓存“a”并使用“a”的旧值。
现在,为了避免这个问题,我声明变量“volatile”如下:
volatile int a = 10;
// Thread T1
void func_1() {
__sync_bool_compare_and_swap(&a, 10, 100);
}
// Thread T2
void func_2() {
volatile int c = a;
/* Some Operations */
volatile int b = a;
/* Some Operations */
}
对于线程T1的__sync_bool_compare_and_swap
完成后线程T2执行int b = a
的相同场景,是否保证读取到“a”的最新值?
缓存一致性和内存一致性模型如何影响原子写入后的 volatile 读取?
最佳答案
volatile
关键字仅确保编译器不会将变量存储在寄存器中,而是在每次使用时从内存中加载变量。它与运行它的系统的缓存或内存一致性模型无关。
关于c++ - 原子写入和 volatile 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34524136/