当我在更新周期中不断地从主线程调用getter并从另一个线程调用setter时,我使用互斥锁来锁定和解锁变量。我在下面提供了 setter 和 getter 的代码
定义
bool _flag;
System::Mutex m_flag;
来电
#define LOCK(MUTEX_VAR) MUTEX_VAR.Lock();
#define UNLOCK(MUTEX_VAR) MUTEX_VAR.Unlock();
void LoadingScreen::SetFlag(bool value)
{
LOCK(m_flag);
_flag = value;
UNLOCK(m_flag);
}
bool LoadingScreen::GetFlag()
{
LOCK(m_flag);
bool value = _flag;
UNLOCK(m_flag);
return value;
}
这在一半的时间里效果很好,但有时变量在调用SetFlag时被锁定,因此它永远不会被设置,从而扰乱了代码流。
谁能告诉我如何解决这个问题?
编辑:
这是我终于做到的解决方法。这只是一个临时解决方案。如果有人有更好的答案,请告诉我。
bool _flag;
bool accessingFlag = false;
void LoadingScreen::SetFlag(bool value)
{
if(!accessingFlag)
{
_flag = value;
}
}
bool LoadingScreen::GetFlag()
{
accessingFlag = true;
bool value = _flag;
accessingFlag = false;
return value;
}