我在一个类中有一个公共变量
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 回答
如果一个对象被多个线程访问,并且至少一个线程是一个数据竞争的编写器 .
您需要同步,原因如下:
使编译器不对访问共享变量的读写重新排序 .
对于其他线程,以一致(原子)和及时(将存储缓冲区刷新到缓存)方式查看此变量的更新 .
您的硬件可能能够以原子方式存储
bool
,但是,出于上述其他原因,您可能希望使用std::atomic<bool>
.你需要同步 . 从多个线程(其中至少一个访问是写入(
toSwitch = true;
))对共享内存位置(toSwitch
)的非同步访问构成数据争用,这使得程序的行为未定义 .