gpt4 book ai didi

c++ - 对共享变量的无保护访问总是数据竞争吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:33:29 25 4
gpt4 key购买 nike

假设 x 是线程间共享变量并且 func 总是返回 0,下面的代码是否包含 C11 和 C++11 方面的数据竞争?请假设 x 是在两个不同的线程中编写的,除了下面的 switch 语句之外,始终使用适当的锁。

int x; // global variable

...

int y; // local variable

...

switch (func())
{
case 1:
{
x = 0;
y = 1;
break;
}
case 2:
{
x = 0;
y = 2;
break;
}
case 3:
default:
{
y = 3;
break;
}
}

标准(C11 和 C++11)中有一条注释排除了向代码引入数据竞争的编译器转换。编译器是否允许像下面这样转换代码?下面的代码肯定包含数据竞争,但问题是编译器是否引入了它,或者它是否已经存在于原始代码中。尽管无法访问,但对共享变量的访问不 protected 。

int x; // global variable

...

int y; // local variable

...

temp = x;
x = 0;
switch (func())
{
case 1:
{
y = 1;
break;
}
case 2:
{
y = 2;
break;
}
case 3:
default:
{
x = temp;
y = 3;
break;
}
}

最佳答案

在C++标准中,一个race是这样定义的:

1.10/4: Two expression evaluations conflict if one of them modifies a memory location and the other one accesses or modifies the same memory location.

1.10/21: The execution of a program contains a data race if it contains two conflicting actions in different threads, at least one of which is not atomic, and neither happens before the other. Any such data race results in undefined behavior.

假设您有多个线程运行相同的代码,由于 func() 总是返回 0(您的声明),没有一个线程可以更改 x 的内容。此外,y 是线程执行的函数的局部变量,因此不共享。因此,在这种情况下不会出现竞争条件。

不允许编译器进行对应于第二个片段的转换,因为:

1.10/22: Compiler transformations that introduce assignments to a potentially shared memory location that would not be modified by the abstract machine are generally precluded by this standard, since such an assignment might overwrite another assignment by a different thread in cases in which an abstract machine execution would not have encountered a data race.

但如果您自己编写代码片段,在上述条件下可能会遇到竞争条件,因为 x 不是原子的,并且在一个线程 (temp=x) 中可能有读访问和写访问在另一个线程中(x=0 或在另一个线程的默认部分 (x=temp)

关于c++ - 对共享变量的无保护访问总是数据竞争吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36682652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com