c++ - Qt同步不可能在这里?

标签 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()
}

但是 mutex 的复制构造函数是私有(private)的。

我可以在这里做什么?

最佳答案

您正在寻找 QMutexLocker

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

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

关于c++ - Qt同步不可能在这里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15843600/

相关文章:

multithreading - 多线程服务器,信号处理。 POSIX

python - 如何设置事件调度程序来检查给定 Mysql 表中是否有新行

python - QTableView 中的虚拟列?

c++ - Qt creator找不到,QTcpServer和QTcpSocket

c++ - qDebug() 不打印任何东西

c++ - 二叉搜索树后继函数

c++ - 为什么这个函数会把RAX压栈作为第一个操作呢?

C++跨平台网络摄像头通过套接字流式传输

c# - 线程如何节省时间?

qt - QImage 到 QML