考虑以下情况:
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()
}
但是互斥锁的拷贝构造函数是私有的。
我可以在这做什么?
答案 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>