C++ C++;同时修改和读取单个全局变量
我在一个类中有一个公共变量 bool-toSwitch=falseC++ 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是否需要
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;
}
}