【发布时间】:2016-04-17 21:53:47
【问题描述】:
假设 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)中有一条注释排除了编译器转换,该转换会导致代码出现数据竞争。编译器是否允许像下面这样转换代码?下面的代码肯定包含数据竞争,但问题是编译器是否引入了它,或者它是否已经在原始代码中。尽管无法访问,但对共享变量的访问不受保护。
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;
}
}
【问题讨论】:
-
在没有任何同步机制的情况下会出现数据竞争,是的。你应该有一个
std::atomic<int> x;。 -
这不仅仅是一场数据竞赛。 C 没有并发进程的概念。
-
@mm 您的示例未显示任何并发执行。您能否添加一下,以便为您提供简洁的答案。
-
@πάντα ῥεῖ 它是有意识的。请查看 C11 标准,尤其是章节5.1.2.4 多线程执行和数据竞争,并查看NOTE 13。这就是我的问题的来源。
-
@Yakk:实际上,并没有什么不同。 WG14 和 WG21 在并发方面合作。
标签: c++ c multithreading c++11 c11