c - cpu 会将 STORE 指令重新排序到同一地址吗?

标签 c multithreading assembly cpu-architecture cpu-cache

给出下面的代码,CPU 会重新排序 STORE a 和 STORE b 吗?从代码逻辑上看,a和b是独立的。

int* __attribute__ ((noinline)) GetMemAddr(int index) {
    static int data[10];
    return &data[0];
}

void fun() {
    int *a=GetMemAddr(1); //use different args to get same address to avoid optimiztion
    int *b=GetMemAddr(2);
    *a=1;
    *b=3;
}

最佳答案

你现在的问题几乎毫无意义。

int* __attribute__ ((noinline)) GetMemAddr(int index) {
    static int data[10];
    return &data[0];
}

void fun() {
    int *a=GetMemAddr(1); //use different args to get same address to avoid optimiztion
    int *b=GetMemAddr(2);
    *a=1;
    *b=3;
}

这个compiled with GCC 7.3 and -O3完全省略了对 GetMemAddr 的第一次调用,因为它没有副作用。它也省略了赋值 *a=1noinline 表示该函数不得内联。这并不意味着它根本不需要调用。

真正避免省略的唯一正确方法是将 ab 声明为 volatile int *。这样,商店也将保持秩序。然而,仍然无法以任何方式保证这些存储是原子,因此另一个线程可以看到有趣的事情发生 - 对于那些您需要使用 C11 原子特性或编译器扩展/保证的线程。

关于c - cpu 会将 STORE 指令重新排序到同一地址吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53845062/

相关文章:

php - C 中的 sha512 哈希结果与其他语言(php、python)不同

c - 初始化一个具有结构体的队列

c - 为什么参数的函数大小增加到字大小?

java - 创建新线程报错 "constructor test in class test cannot be applied to given types"

c - 是否有安全的方法来检查 pthread 是否存在?

assembly - 如何让 gdb 反汇编整个函数?

c - 汇编代码 : logic behind calculating offset into stack

c - 排序结构记录

c - 如何使用节点指针建立链表解决赋值中的不兼容类型

c++ - 多线程执行的输出只发生一次?