在这种情况下我可以不使用发布和获取障碍吗?

标签 c multithreading x86 memory-barriers memory-fences

This tutorial说如下:

every load on x86/64 already implies acquire semantics and every store implies release semantics.

现在假设我有以下代码(我在评论中写下了我的问题):

/* Global Variables */

int flag = 0;
int number1;
int number2;

//------------------------------------

/* Thread A */

number1 = 12345;
number2 = 678910;
flag = 1; /* This is a "store", so can I not use a release barrier here? */

//------------------------------------

/* Thread B */

while (flag == 0) {} /* This is a "load", so can I not use an acquire barrier here? */
printf("%d", number1);
printf("%d", number2);

最佳答案

本教程在汇编/机器级别讨论加载存储,您可以在其中依赖 x86 ISA 语义,其中包括加载时获取和释放-店内。

然而,您的代码是 C,它根本不提供此类保证,并且编译器可以自由地将其转换为与您在加载和存储方面所期望的完全不同的东西。这不是理论上的,而是在实践中发生的。所以简短的回答是:不,不可能在 C 中合法地移植 - 尽管如果幸运的话它可能会起作用。

关于在这种情况下我可以不使用发布和获取障碍吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50473452/

相关文章:

c++ - C++11 theads 的最基本并行化失败

assembly - 为什么PUSHAD指令存储ESP?

c - 如何反汇编一个剥离的应用程序的主要功能?

c - 当我们不知道可用内存的大小时,如何实现伙伴分配器?

java - volatile 变量和同步 setter 和 getter

Ruby:有关于线程池的 gem 吗?

在 C 语言中比较和交换机器码

assembly - 让调用堆栈向上增长会使缓冲区溢出更安全吗?

c - 为什么 "char *ptr={' R' ,'E' ,'D' ,'\0' } ;"gives too many warnings while "char *ptr ="RED";"工作正常?

无法将结构的地址分配给类型为指向该结构的指针的 typedef 的变量