Ton*_*ion 15 c++ multithreading memory-model c++11 semantics
我已经看到这个关于获取,释放,消费等的问题存在,但是,没有答案真正定义了"消费操作"实际上是什么.
在1.10第5段中,它指出:
在一个或多个存储器位置上的同步操作是消费操作,获取操作,释放操作,或获取和释放操作两者.
我想知道是否有人可以解释这是什么,因为它在C++ 11标准的1.10部分中使用?
显然,在一些搜索之后,"消费操作"是一种存储操作,其中在几次操作中加载之后使用从存储器读取的值,并创建数据依赖性.
能够在不引入显式内存屏障的情况下订购操作,是明显的(根据我的理解)目标memory_order_consume.
因此
memory_order_consume,编译器和CPU 需要仅针对那些后续加载和存储来对有问题的加载进行排序,其地址或值是根据加载的值计算的. 资源
本文稍后会说:
/*Example code elided */
Run Code Online (Sandbox Code Playgroud)
关键点在于
atomic_load_explicit()使用memory_order_consume保证后续访问将看到由insert_foo()它们执行的任何初始化,即使它们是并发执行的,并且没有显式内存栅栏指令的开销.相反,memory_order_acquire在弱有序系统上需要显式内存屏障,并且会在所有系统上过度约束编译器优化.
C++ 11标准草案n3485定义memory_order_consume为:
29.3顺序和一致性[atomics.order]
memory_order_consume:加载操作对受影响的内存位置执行使用操作.
因此,根据我的理解,它是命令内存加载,以便后续加载和使用该加载的存储确实是后续的.换句话说,正在消耗负载.