C++原子操作示例:#1与#4同时为真是否依赖无中生有值?
原子操作中的“无中生有值”判定问题
给定如下示例:x初始值为0,y初始值为2。
std::atomic<int> x = 0, y = 2; // thread 1: if(y.load(relaxed) == 1){ // #1 x.store(1,relaxed); // #2 } //thread 2: int pre = x.load(relaxed); // #3 while(pre != 0){ if(x.compare_exchange_strong(pre, pre+1, acquire, relaxed)){ // #4 break; } } y.store(1,relaxed); // #5
核心问题
若#1与#4均返回true,该结果是否依赖无中生有值(out-of-thin-air value)?
标准依据
[atomics.order] p8规定:实现应确保不存在循环依赖自身计算的“无中生有”值。
初始示例分析
#1返回true的前提是读取到#5写入的1,而无论pre的值是0还是非0,#5都会执行。#4返回true的必要条件是pre != 0,但x初始值为0,因此pre只能是读取到#2写入的1——也就是说#3和#4必须都读取#2的结果。
基于上述分析,可将原示例简化为如下形式:
// thread 1: if(y.load(relaxed) == 1){ // #1 x.store(1,relaxed); // #2 } // thread 2: int pre = 1; while(!x.compare_exchange_strong(pre,pre+1, acquire, relaxed)){} // #4 y.store(1,relaxed); // #5
简化后的问题
此时依赖链为:#1依赖#5的写入结果,#5的执行依赖#4读取到#2的写入结果,#2的执行又依赖#1返回true。若#1与#4均返回true,该结果是否属于无中生有值(OOTA)?
内容的提问来源于stack exchange,提问作者xmh0511
相关产品推荐
相关产品推荐

