[英]what's the possible result of the following code in concurrency situation?
我看到一个面试问题如下:以下代码的结果可能的范围是多少:
void ThreadProc(int& sum)
{
for (int i = 1; i <= 50; i++)
{
sum += 1;
}
}
int main()
{
int sum = 0;
thread t1(ThreadProc, std::ref(sum));
thread t2(ThreadProc, std::ref(sum));
t1.join();
t2.join();
cout << sum << '\n';
return 0;
}
给出的答案是[50,100] 。 但是,我认为它应该是[2,100] 。 如果给定的序列如下, sum
将为2 。
t1
获取 cpu,并将初始sum=0
加载到缓存中(假设缓存的 sum 是c1
,现在它的值为0
)。t2
获取 cpu,并增加(49 倍),现在总和为 49。t1
获取 cpu,并计算sum = c1 + 1
,现在sum
为1
。t2
获取 CPU,并加载sum
( =1
) 并计算sum + 1
并缓存结果(现在c1
为2
)。 在t1
将c1
写入变量sum
之前, t2
抢占 cpu。t2
获取 cpu,并增加(1 倍)[现在sum
将为x
(值无关紧要)],然后thread t2
完成。 线程t1
获取 cpu,并将缓存结果c1
写入 sum,现在sum
为2
。
我对吗?
此代码会导致未定义的行为,因为sum
是从两个不同的线程修改的,没有任何并发保护。 这在 C++ 标准中称为数据竞争。
因此,任何行为都是可能的(包括但不限于您提到的所有情况)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.