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

时间:2015-09-28 09:00:15

标签: c++ multithreading synchronization thread-safety

我在一个类

中有一个公共变量

bool toSwitch = false;

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

Func_Thread2()
{
   toSwitch = true;
}

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

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

更新2:

在这种情况下会发生什么......?

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

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

这里是否需要同步,一个线程修改,另一个线程读取该全局变量的值。

2 个答案:

答案 0 :(得分:3)

如果一个对象被多个线程访问,并且至少有一个线程是作为数据竞争的编写者。

您需要同步,原因如下:

  1. 编译器不要对访问共享变量的读写进行重新排序。
  2. 让其他线程以一致(原子)和及时(将存储缓冲区刷新到缓存)方式查看此变量的更新。
  3. 您的硬件可能能够以原子方式存储bool,但是,出于上述其他原因,您可能希望使用std::atomic<bool>

答案 1 :(得分:0)

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