c++ - 原子写入和 volatile 读取

标签 c++ multithreading atomic volatile compare-and-swap

我正在设计一个多线程算法,其中的要求是读取共享变量的最新值。对变量的写入是原子的(使用比较和交换)。但是,读取不是原子的。

考虑以下示例:

//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/

相关文章:

c# - 我可以在 C# 中的一行上锁定(某物)吗?

c++ - 全局对象中内置类型的成员变量是否初始化为零?

c# - 当应用程序运行后台工作程序时,NotifyIcon 不显示上下文菜单

c++ - 可靠地确定 char 的大小

c++ - 联盟中的atomic <>作为性能黑客

c++ - atomic_compare_exchange 与互斥锁

c - C中非原子类型的原子操作是原子的吗?

algorithm - 关于 Bakery 算法的一些一般问题

c++ - C1083 : Cannot open include file: 'GL/gl.h' : No such file or directory

c++ - 什么是正确的 macOS vscode intellisense C++ 包含标准库的路径?