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

标签 c++ multithreading

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

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/

相关文章:

c++ - 不正确配对的函数示例

c++ - 在 Visual Studio 2010 中使用 boost::test - 如何查看测试输出?

c++ - 堆上的分配会影响访问性能吗?

Java 多线程中的 volatile 关键字

java - java中的多线程无法传达变化

android - android如何在按下按钮时停止音频线程?

c++ - 如何使用模板找到参数 T 的最大可解引用级别

c++ - std::cout 在哪里定义?

java - 在 Eclipse 中使用 Java VM 的 native 线程

java - 如何在多线程环境下正确使用ByteBuffer?