我对5.1.2.4(p22)
中定义的副作用概念可见序列的定义感到困惑:
这是我目前对该概念的理解:
由于相对于B的可见副作用应该是“在B
之前发生的最接近的副作用”,我可以想象以下情况:_Atomic int i = 10;
void *increment(void *ignored){
i++;
printf("%d\n", i); //<<----- B
}
void *decrement(void *ignored){
i--;
printf("%d\n", i);
}
int main(void){
i = 100;
//start two threads with increment and decrement correspondingly
}
考虑到上述情况,我假设B
是increment
函数中的值计算,因此,关于B
的可见副作用序列是“i++
,i--
”。由于i = 100
在创建线程之前已排序,因此它不属于B
的可见副作用序列。
我的解释是真的吗?
最佳答案
C2x标准的working draft合并了C17(“错误修正”)标准中所做的更改。更改此部分的主要目的是在C++和C之间对齐内存一致性模型,并删除DR406缺陷报告中所述的冗余。
如您所见,委员会竭尽全力试图阐明内存一致性模型并简化构成“数据竞赛”的内容。
棘手的部分是,C17错误修正中的更改中只有一个是“规范性的”,这意味着在最终确定C2x标准之前,符合要求的实现无需考虑对本节所做的更改。
至于您对当前标准现有部分的解释,我不得不说这是有争议的。标准委员会认识到当前版本中的困惑和模棱两可,您最好等待本节有机会在新的C2x标准下安顿下来,然后再对此进行过多担心。
关于c - 可见的副作用序列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55730243/