首页 文章

C并发修改和读取单个全局变量

提问于
浏览
2

我在一个类中有一个公共变量

bool toSwitch = false;

Func_Thread1()
{
   if(toSwitch)
   {
      .....
      ....
      toSwitch = false;
   }
}

Func_Thread2()
{
   toSwitch = true;
}

Func_Thread1 将被频繁调用(2秒一次),并且在某个时间间隔内 Func_Thread2 将被调用(1分钟一次)并将全局变量更改为true . 所以在下一个 Func_Thread1 调用if条件将成为真 .

toSwitch 是否需要同步,因为它可以同时读取和修改不同的线程..?

Update 2:

在这种环境下会发生什么......?

Func_Thread1()
    {
       if(toSwitch)
       {
          .....
          ....
       }
       else
       {
         ...
       }
    }

Func_Thread2()
{
   if(toSwitch)
   {
    toSwitch = false;
   }
   else
   {
     toSwitch = true;
   }
}

这里需要同步,一个线程修改,其他线程读取该全局变量的值 .

2 回答

  • 3

    如果一个对象被多个线程访问,并且至少一个线程是一个数据竞争的编写器 .

    您需要同步,原因如下:

    • 使编译器不对访问共享变量的读写重新排序 .

    • 对于其他线程,以一致(原子)和及时(将存储缓冲区刷新到缓存)方式查看此变量的更新 .

    您的硬件可能能够以原子方式存储 bool ,但是,出于上述其他原因,您可能希望使用 std::atomic<bool> .

  • 0

    你需要同步 . 从多个线程(其中至少一个访问是写入( toSwitch = true; ))对共享内存位置( toSwitch )的非同步访问构成数据争用,这使得程序的行为未定义 .

相关问题