我在一个类
中有一个公共变量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;
}
}
这里是否需要同步,一个线程修改,另一个线程读取该全局变量的值。
答案 0 :(得分:3)
如果一个对象被多个线程访问,并且至少有一个线程是作为数据竞争的编写者。
您需要同步,原因如下:
您的硬件可能能够以原子方式存储bool
,但是,出于上述其他原因,您可能希望使用std::atomic<bool>
。
答案 1 :(得分:0)
您需要同步。从多个线程(其中至少一个访问是写入(toSwitch
)的共享内存位置(toSwitch = true;
)的非同步访问构成数据争用,这使得程序的行为未定义。