考虑以下情况:
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/