C语言中如何利用原子操作实现内存次序和屏障功能?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1375个文字,预计阅读时间需要6分钟。
内存次序+为优化程序代码,编译器和处理器可以自主地对任意无相互依赖关系的命令进行重新排序。例如,两个分配语句+a=0;B=1;可以以任意顺序执行。然而,在多线程环境下,“
内存次序
为优化程序代码,编译器和处理器可以自由地对任何无相互依赖关系的命令进行重新排列。例如,两个分配语句 a=0;B=1;,它们可以以任一顺序执行。然而,在多线程环境下,由于不同线程内存操作之间的依赖性对于编译器或处理器通常是不可见的,所以对编译器或处理器执行命令重新排序可能会引发错误。使用原子对象可以默认地防止此类重新排序。但是,防止优化意味着可能会牺牲速度。有经验的程序员可以在较低的内存次序请求下,通过明确地使用原子操作提高性能。
对于每个执行原子操作的函数(例如 atomic_store()),都有另一个版本,这些函数的名称以 _explicit 结尾,如 atomic_store_explicit(),它们增加了一个类型为 memory_order 的参数。
memory_order 类型是一个枚举,它定义了以下常量,以指定特定的内存次序请求:
memory_order_relaxed
调用者指定无任何内存次序请求,从而使编译器可以自由地改变操作的顺序。本文共计1375个文字,预计阅读时间需要6分钟。
内存次序+为优化程序代码,编译器和处理器可以自主地对任意无相互依赖关系的命令进行重新排序。例如,两个分配语句+a=0;B=1;可以以任意顺序执行。然而,在多线程环境下,“
内存次序
为优化程序代码,编译器和处理器可以自由地对任何无相互依赖关系的命令进行重新排列。例如,两个分配语句 a=0;B=1;,它们可以以任一顺序执行。然而,在多线程环境下,由于不同线程内存操作之间的依赖性对于编译器或处理器通常是不可见的,所以对编译器或处理器执行命令重新排序可能会引发错误。使用原子对象可以默认地防止此类重新排序。但是,防止优化意味着可能会牺牲速度。有经验的程序员可以在较低的内存次序请求下,通过明确地使用原子操作提高性能。
对于每个执行原子操作的函数(例如 atomic_store()),都有另一个版本,这些函数的名称以 _explicit 结尾,如 atomic_store_explicit(),它们增加了一个类型为 memory_order 的参数。
memory_order 类型是一个枚举,它定义了以下常量,以指定特定的内存次序请求:
memory_order_relaxed
调用者指定无任何内存次序请求,从而使编译器可以自由地改变操作的顺序。
