gpt4 book ai didi

c++ - 以下代码在并发情况下的可能结果是什么?

转载 作者:行者123 更新时间:2023-11-30 04:55:09 24 4
gpt4 key购买 nike

我看到一个面试题如下:以下代码的结果的可能范围是什么:

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

  1. thread t1 获取cpu,并将初始的sum=0加载到缓存中(假设缓存的sum是c1,它的值现在是 0)。
  2. 线程t2获取cpu,增加(49次),现在总和为49。
  3. 线程t1获取cpu,计算sum = c1 + 1,此时sum1
  4. 线程 t2 获取 cpu,并加载 sum (=1) 并计算 sum + 1并缓存结果(c1 现在是 2)。在c1t1写入变量sum之前,t2抢占了cpu。
  5. thread t2 获取 cpu,并增加(1 倍)[现在 sum 将是 x(值不matter)], 然后 thread t2 结束了。
  6. 线程t1获取cpu,并将缓存结果c1写入sum,现在 sum2

    我说得对吗?

最佳答案

此代码导致 undefined behaviour因为 sum 是从两个不同的线程修改的,没有任何并发​​保护。这在 C++ 标准中称为数据竞争

因此任何行为都是可能的(包括但不限于您提到的所有情况)。

Link to cppreference page about memory model .

关于c++ - 以下代码在并发情况下的可能结果是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53201488/

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