Qt / C ++:递归互斥,'同步区'并阻止信号

时间:2016-11-10 14:54:11

标签: c++ multithreading qt recursion qt-signals

首先,我想指出我已经看过这个但却无法找到我正在寻找/已经与过于详细的答案混淆的答案。

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

主题A:

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不需要递归互斥。但是,foo()和bar()很可能同时从线程B调用(信号和时隙)。这是否意味着我需要递归互斥?

也;有没有理由不使用Qt :: BlockingQueudConnection?一位同事认为这是危险的,因为它会在调用执行插槽之前将调用线程发送到睡眠状态 - 但这与mutex不同吗?

此外;看过关于构造互斥体的帖子(pthread mutex locking variables used in statements)。在这里,它提到了在价值观上制作本地副本。如果我要为线程A使用类似的东西,例如

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

这会阻止requestCopy被使用时访问请求吗?我想在我的代码中使用这种样式以简化,但如果你在一个线程中读取和写入,这将不起作用?

任何帮助都会很棒。

1 个答案:

答案 0 :(得分:0)

从你所展示的,它看起来像(重写)

某个模块(线程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;
};

如果确实如此(这样一切都很好),就不需要递归互斥。