Qt同步不可能在这里?

时间:2013-04-05 21:09:11

标签: c++ multithreading qt

考虑以下情况:

class SomeClass : public QObject
{
  Q_OBJECT
private:
    unsigned long long someVar;

public:
    unsigned long long getSomeVar(){
        return someVar;
    void threadFunc();
}

threadFunc()将在新线程中调用(您猜对了),它将如下所示:

void SomeClass::threadFunc()
{
  ++someVar;
  // Do stuff...
}

现在,在另一个主题中,我想阅读someVar。我是通过致电getSomeVar()来做到的。但是,需要同步。我怎么做?对于带有somevar的线程,同步并不难。它只是

void SomeClass::threadFunc()
{
  mut.lock();
  ++someVar;
  mut.unlock();
  // Do stuff...
}

在类声明中添加了QMutex mut。但是如何同步getSomeVar()?我不能只说:

unsigned long long getSomeVar(){
  mut.lock();
  return someVar;
  mut.unlock();
}
由于之前的mut.unlock()语句,

return永远不会被调用。

我知道通常会写这些冲突......

unsigned long long getSomeVar(){
  QMutex mut;
  // mut-constructor calls mut.lock()
  return someVar;
  // mut-destructor calls mut.unlock()
}

...但在这种情况下,我需要在getSomeVar()threadFunc()内使用互斥锁。我试过了

unsigned long long getSomeVar(){
  // constructing mutex from mut (which is the class' mutex)
  QMutex mutex(mut);
  // mutex-constructor calls mut.lock()
  return someVar;
  // mutex-destructor calls mut.unlock()
}

但是互斥锁的拷贝构造函数是私有的。

我可以在这做什么?

2 个答案:

答案 0 :(得分:7)

您正在寻找QMutexLocker

{
    QMutexLocker locker(&mut);
    ...
}

// Goes out of scope, unlocks the mutex in its destructor

答案 1 :(得分:2)

您将互斥锁 lock 混淆:每个可控变量只有一个互斥锁,但可能会有很多锁定它的尝试!

你需要一个单独的锁类,每个线程有一个实例

struct Lock
{
    QMutex & m_;
    Lock(QMutex & m) : m_(m) { m_.lock(); }
    ~Lock() { m_.unlock();}
};

用法:

QMutex mutex;

void thread_function()
{
    Lock lk(mut);
    critical_operation();
}   // unlocks "mutex" as if by magic

Qt可能已经为您提供了这样的课程。 (标准库也这样做:std::mutex std::lock_guard<std::mutex>。{/ p>