另外一个用于测试内存屏障差异的 C 语言示例程序(自己测试)
Test1
函数用于更新电压和电流值并设置刷新标志,Test2
函数用于读取这些值并进行检查。由于现代CPU可能会对指令进行重排以及存在缓存一致性问题,可能会导致Test2
函数无法正确读取到Test1
函数更新后的值,从而引发可见性问题。为了解决这个问题,可以使用内存屏障来确保内存操作的顺序和可见性。
在Linux C语言中,可以使用GCC提供的内置函数__sync_synchronize()
来实现内存屏障,它相当于一个全内存屏障,会阻止编译器和CPU对内存操作进行重排。
以下是修改后的代码:
#include <stdio.h>
// 假设这些变量是全局的
volatile int32_t Reflashflag