0

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

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。同时可能会发生定时器超时。你能帮我妥善处理这种情况吗?

4

1 回答 1

1

QMutexLocker 可以在这种情况下使用

这是我的例子

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() 函数直接从不同的线程调用。

于 2017-07-17T15:30:44.890 回答