在用于并发编程的学校项目期间,我们在项目中包含<stdatomic.h>
并修改了变量声明的相应数据类型,以允许对某些全局变量进行原子操作。
当我开始研究stdatomic标题时,我看到定义了一堆数据类型和操作以允许所需的行为。
当我编译并执行对象转储时,我注意到的是现在添加了内存栅栏。我还假设像my_atomic_variable += 5;
这样的操作被替换为stdatomic头中声明的一些宏/函数。
我想知道的是如何简单地通过更改源代码中的数据类型,添加内存栅栏等。我想在某些时候,像__atomic_signal_fence
这样的函数会嵌入到发生读/写的源代码中,但我不知道这是如何实现的。不幸的是,阅读头文件并没有多大帮助。我得到的印象是有一些关于编译器如何工作的概念,我不熟悉或不理解。
更新
在回应评论时,让我澄清一下。我理解C的方式是存在某些基本数据类型,例如int
。我想象atomic_int
方面的stdatomic实现int
和一些额外的代码。在我看来,当一些原子int被赋值为my_atomic_int = 1
时,不知何故,这会被转换为比指定常规整数通常所需的更复杂的指令集。
我不明白的是,在允许使用=
运算符的stdatomic代码中可能存在的内容,因为C不支持运算符重载。实际上这是什么代码? gcc是否知道如何翻译原子指令,因为它内置了原子数据类型?如果没有,我怎么能编写类似于stdatomic的代码,其中gcc知道如何为我的自定义数据类型处理=
运算符?