QTimer超时和QMutex互动

时间:2017-07-17 15:04:56

标签: qt qtimer qmutex

假设我们有一些基本的计时器和一个定期调用的插槽。

SomeObject::SomeObject()
{
  QTimer *timer = new QTimer;
  connect(timer , SIGNAL(timeout()), this, SLOT(updateState()));
}

void  SomeObject::updateState()
{
   // some operations leading to update of updatedValue
}

我也有来自同一对象的函数强制更新并返回一些值。

bool  SomeObject::getLatestState()
{
  updateState();
  return updatedValue;
}

可以从不同的线程直接调用此函数。这引起了线程安全的问题。 getLatestState中的简单互斥锁无效,因为在极少数情况下getLatestState从另一个启动updateState的线程调用。并且同时可能发生计时器超时。你能帮我正确处理这种情况吗?

1 个答案:

答案 0 :(得分:1)

QMutexLocker can be used in such situations

this my exampl

static QMutex mainMutex;
.....
MainController* MainController::s_instance = NULL;
.....    
MainController* MainController::getInstance()
{
    if(!s_instance){
        QMutexLocker lock(&mainMutex);
        if(!s_instance){
            s_instance = new MainController;
        }
    }
    return s_instance;
}

getInstance() function directly called from different threads.