我在更新周期中不断从主线程调用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;
}
LOCK()
和UNLOCK()
的定义吗? - Andy ProwlSystem :: Mutex
类中的错误。 - Mike Seymourstd::atomic<bool>
?这样就不需要自己进行加锁了。 - stefanLOCK
和UNLOCK
。首先,编写一个 RAII 锁定器类:struct locker { System::Mutex* m; locker(System::Mutex& m_):m(&m_){m->Lock();} void unlock(){if (m)m->Unlock();} ~locker() {unlock();} };
。将调用LOCK(m_flag);
替换为locker lock(m_flag);
,在函数或其他作用域退出时应删除对lock
的UNLOCK
,在少数其他情况下,应替换为lock.unlock();
。这应该会减少泄漏到m_flag
的锁的风险。 - Yakk - Adam Nevraumont