Qt/C++:递归互斥、'sync zones'和阻塞信号

Qt/C++: Recursive mutex, 'sync zones' and blocking signals

本文关键字:zones sync 信号 C++ 递归 Qt      更新时间:2023-10-16

首先我想指出的是,我已经查过了,但找不到我要找的答案/已经被过于详细的答案所迷惑了。

我有一个使用两个线程的程序。一个布尔值需要在线程A中设置和读取,但只在线程b中读取

线程:

Module::Module(){
}
void Module::foo(){
    mutex.lock();
    bool request = true;
    mutex.unlock();
}
void Module::bar(){
    mutex.lock();
    if (request){
        mutex.unlock();
        // do stuff
    }else{
        mutex.unlock();
    }
} 

线程B:

Provider::Provider(){
    module = new Module;  // pointer to class request 'lives in'
}
void Provider::foo(){
    mutex.lock();
    if (module->request){
        mutex.unlock();
        // do stuff
        }
    }else{
        mutex.unlock();
    }
}

我的问题可能看起来很微不足道,但它一直困扰着我。线程A不能同时读取和写入,因此我认为A不需要递归互斥锁。然而,线程B(信号和插槽)同时调用foo()和bar()的可能性很小。这是否意味着我需要递归互斥?

也;有任何理由不使用Qt::BlockingQueudConnection?一位同事认为这很危险,因为它会将调用线程发送到睡眠状态,直到信号执行了槽位——但这与互斥锁不一样吗?

此外;看过一篇关于结构互斥锁的文章(语句中使用的pthread互斥锁变量)。在这里,它提到了对值进行本地复制。如果我要为线程A使用类似的东西,例如

mutex.lock();
requestCopy = request;
mutex.lock();
...
if(requestCopy){
// do stuff
}

这是否也会阻止requestCopy被使用的请求访问?我希望使用这种风格在我的代码简单,但这不会工作,如果你读和写在一个线程?

任何帮助都太好了。

从您所显示的内容来看,它看起来像(重写)

某个模块(线程A):

class Module {
private:
    bool request = false;
    QMutex m;
public:    
    void set_request(bool b) {
        QMutexLocker lock(&m);
        request = b;
    }
    bool get_request() {
        QMutexLocker lock(&m);
        return request;
    }
    void bar() {
        if (get_request()) {
            // do stuff
        }
    }
};

线程B:

class Provider {
public:
    Provider() {
        module = new Module();
    }
    void foo() {
        if (module->get_request()){
            // do stuff
        }
    }
private:
    Module *module;
};

如果确实是这种情况(并且这样一切都很好),则不需要递归互斥锁。