Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;同时修改和读取单个全局变量_C++_Multithreading_Synchronization_Thread Safety - Fatal编程技术网

C++ C++;同时修改和读取单个全局变量

C++ C++;同时修改和读取单个全局变量,c++,multithreading,synchronization,thread-safety,C++,Multithreading,Synchronization,Thread Safety,我在一个类中有一个公共变量 bool-toSwitch=false Func_Thread1() { if(toSwitch) { ..... .... toSwitch = false; } } 及 Func_Thread1将被频繁调用(2秒一次),并且在特定的时间间隔内Func_Thread2将被调用(1分钟一次),并将全局变量更改为true。因此,在下一次Func_Thread1调用时,if条件将变为true toSwitch是否需要

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

bool-toSwitch=false

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

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

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

更新2:

在这种环境下会发生什么

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


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

如果一个对象被多个线程访问,并且至少有一个线程是数据争用的写入程序

您需要同步,原因如下:

  • 使编译器不会围绕对共享变量的访问对读写进行重新排序
  • 让其他线程以一致(原子)和及时(将存储缓冲区刷新到缓存)的方式查看此变量的更新

  • 您的硬件可能能够以原子方式存储
    bool
    ,但是,出于上述其余原因,您可能希望使用
    std::atomic
    ,您需要同步。从多个线程对共享内存位置(
    toSwitch
    )的非同步访问(其中至少有一个访问是写入的)(
    toSwitch=true;
    )构成了数据竞争,这使得程序的行为未定义。

    同步实际上不会影响可见性传播的及时性。事实上,这一概念根本没有标准化(只有一个请求说明要求实现在不介意的情况下传播更新)。同步只影响相对顺序。我不希望其他线程以原子方式看到更新。。下次打电话时让它看看。。如果有的话,还有什么问题吗?@KerrekSB你错了。请阅读以了解更多详细信息。@RahulJain,您必须在此处使用原子。(或其他形式的同步)。如果没有它,编译器可能只会看到toSwich在执行线程中从未被修改,并完全放弃if语句。您可能会通过简单的volatile解决问题,但这是非常不明智的。原子写入与互斥锁/写入/互斥解锁在无竞争互斥上可能产生相同的速度,但在有竞争的互斥中,原子写入会更快,问题是不使用同步会导致未定义的行为。它很可能对你“起作用”。可能会的。但在编译器或操作系统更新之前,它可能会起作用。If可能工作到下周二,然后决定跳转到磁盘格式函数。可能不会。。但语言中没有任何东西表明它会起作用。有一种简单的方法可以告诉编译器你在做什么,这样它就总能做正确的事情,那就是使用同步。这就是它的目的!
     Func_Thread1()
        {
           if(toSwitch)
           {
              .....
              ....
           }
           else
           {
             ...
           }
        }
    
    Func_Thread2()
    {
       if(toSwitch)
       {
        toSwitch = false;
       }
       else
       {
         toSwitch = true;
       }
    }