Я использую мьютекс для блокировки и разблокировки переменную, как я называю геттер от основного потока непрерывно в цикле обновления, и я называю сеттер из другого потока. Я предоставил код и присваиватель нижеблокировки мьютекса не отпирания
Definition
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 и, следовательно, он никогда не устанавливается, тем самым нарушая поток кода.
Может ли кто-нибудь сказать мне, как решить эту проблему?
EDIT:
Это обходной путь я, наконец, сделали. Это просто временное решение. Если у кого-то есть лучший ответ, пожалуйста, дайте мне знать.
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 Prowl Я добавил определения для LOCK() и UNLOCK() – glo