gpt4 book ai didi

c++ - 一个有两个线程的程序,一个线程增加全局var,另一个线程减少相同的var,var总是对的吗?

转载 作者:行者123 更新时间:2023-11-30 18:40:49 25 4
gpt4 key购买 nike

我对这个问题感到困惑,当我查看某人的 C++ 时,它就出现了代码。

例如在 C++ 中:

// Global var
int g_var = 0;

// thread 1 call Func1() forever:
void Func1() {
++g_var;
}

// thread 2 call Func2() forever:
void Func2() {
--g_var;
}

定义Func1通话次数times1 , Func2通话次数times2

  • times1 - times2总是= g_var
  • 如果代码位于 C 中怎么办?不在C++中?
  • 如果g_var会怎样?使用volatile装饰?
  • 使用atomic_increase/atomic_decrease是唯一正确的方法吗?

我认为,应该使用 violatileC++ ,不一定要使用InterlockedIncrement这样的原子操作在Windows中,因为汇编代码只有一行,一个add说明:

mov         eax,1
add dword ptr [a],eax

最佳答案

按照问题出现的顺序回答您的问题:

  • 不,您的程序有未定义的行为。可能的情况是,线程 1 读取变量(要增加),被中断,然后线程 2 读取变量(要减少),减少它并将其写回(因此与我们开始的值相比,它是负一) ),然后线程 1 继续,增加其内存的旧值并将其写回变量,与我们开始的值相比加一。

  • 这里的语言不会改变任何内容。

  • volatile只保证单个线程可能不会缓存变量的值,即 ++g_var; ++g_var;将读取变量,增加,写入,读取,增加,写入。它不会被 g_var += 2 取代由优化器。但线程在读和写之间仍然可能被中断,这是危险的部分。

  • 这是一个需要原子操作的完美示例。要么在 int 上使用原子操作,或使用std::atomic<int>当您调用普通运算符时,包装器会自动为您执行此操作,从而使您的代码更具可读性。

    只需替换 int g_varstd::atomic<int> g_var解决任何问题。

关于c++ - 一个有两个线程的程序,一个线程增加全局var,另一个线程减少相同的var,var总是对的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24801865/

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