繁体   English   中英

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

[英]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

  1. 线程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并缓存结果(现在c12 )。 t1c1写入变量sum之前, t2抢占 cpu。
  5. 线程t2获取 cpu,并增加(1 倍)[现在sum将为x (值无关紧要)],然后thread t2完成。
  6. 线程t1获取 cpu,并将缓存结果c1写入 sum,现在sum2

    我对吗?

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

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

链接到关于内存模型的 cppreference 页面

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM