我对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
}

考虑到上述情况,我假设Bincrement函数中的值计算,因此,关于B的可见副作用序列是“i++i--”。由于i = 100在创建线程之前已排序,因此它不属于B的可见副作用序列。

我的解释是真的吗?

最佳答案

C2x标准的working draft合并了C17(“错误修正”)标准中所做的更改。更改此部分的主要目的是在C++和C之间对齐内存一致性模型,并删除DR406缺陷报告中所述的冗余。

如您所见,委员会竭尽全力试图阐明内存一致性模型并简化构成“数据竞赛”的内容。

棘手的部分是,C17错误修正中的更改中只有一个是“规范性的”,这意味着在最终确定C2x标准之前,符合要求的实现无需考虑对本节所做的更改。

至于您对当前标准现有部分的解释,我不得不说这是有争议的。标准委员会认识到当前版本中的困惑和模棱两可,您最好等待本节有机会在新的C2x标准下安顿下来,然后再对此进行过多担心。

关于c - 可见的副作用序列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55730243/

10-13 05:44