gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:45:49 26 4
gpt4 key购买 nike

考虑以下情况:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com