在需要确保操作顺序但不需要完整内存屏障的情况下,编译器屏障提供了轻量级的解决方案。


例子代码
#include <stdio.h>
#include <stdatomic.h>
// 编译器屏障的常见实现方式
#ifdef _MSC_VER
#include <intrin.h>
#define compiler_barrier() _ReadWriteBarrier()
#else
#define compiler_barrier() __asm__ __volatile__("" ::: "memory")
#endif
int main() {
int x = 0;
int y = 0;
x = 5;
// 插入编译器屏障
compiler_barrier();
y = 10;
printf("x = %d, y = %d\n", x, y);
// 多线程示例
_Atomic int flag = 0;
int data = 0;
// 线程1:写入数据后设置标志
data = 42;
compiler_barrier(); // 确保数据写入在标志设置之前
flag = 1;
// 线程2:检查标志后读取数据
while (flag == 0) {
// 等待
}
compiler_barrier(); // 确保在读取数据前标志已更新
printf("Data: %d\n", data);
return 0;
}
1073

被折叠的 条评论
为什么被折叠?



