【发布时间】:2019-09-07 20:37:27
【问题描述】:
我对@987654322@中定义的可见的副作用序列概念的定义感到困惑:
原子对象
M上的可见副作用序列,带有 关于M的值计算B,是最大连续的M的修改顺序中的副作用子序列,其中 对于B,第一个副作用是可见的,并且对于每个 后续的副作用,不是B发生在它之前。
这是我目前对该概念的理解:
由于关于 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 的可见副作用序列。
我的解释是真的吗?
【问题讨论】:
-
您混淆了 C 和 C++。 C++ 不是 C。委员会将这个概念从标准中删除,因为它是多余的。 open-std.org/jtc1/sc22/wg14/www/docs/dr_406.htm
-
@alinsoar 你混淆了 C 和 C++ 我不太明白你的意思。我什至没有阅读 C++ 对它的规定。另外你为什么删除C标签?我引用了 N1570 草案。我把它回滚了。
-
过失。我以为它是从 C++ 引用的。但是您可以在我发布的技术勘误中找到答案。
-
我认为您在这里做出了错误的假设,即如果您依次启动 2 个线程“A”然后“B”,那么线程“A”将在线程“B”之前运行。他们将可能按该顺序执行,但不能保证。
标签: c multithreading concurrency language-lawyer