Qt/C++:递归互斥、'sync zones'和阻塞信号
Qt/C++: Recursive mutex, 'sync zones' and blocking signals
首先我想指出的是,我已经查过了,但找不到我要找的答案/已经被过于详细的答案所迷惑了。
我有一个使用两个线程的程序。一个布尔值需要在线程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;
};
如果确实是这种情况(并且这样一切都很好),则不需要递归互斥锁。
相关文章:
- [WIN API]为什么共享相同的 WriteFile(sync) 和 ReadFile(sync) 句柄会导致 Rea
- boost :: Beast Sync http客户端的超时
- 多次调用存储过程时C++连接器"Commands out of sync" mySQL
- MySQL 异常"connection lost during query"、"MySQL server has gone away"和"command out of sync"
- C 中Bash Sync的替代方案
- GNU make 3.81 - 如何做'--output-sync=target'
- 适用于C++的 Dropbox Sync API
- cin.sync 和 clear 不起作用
- boost::asio sync server 在第一个连接后不接受连接
- C++:为什么这个 sync() 在这个组合模式中不起作用?
- cin.ignore 和 cin.sync 之间的区别
- 什么时候应该使用std::async和sync作为策略
- emulate std::async with std::launch::sync?
- MySQL:"Commands out of Sync"错误(C 连接器)
- Qt/C++:递归互斥、'sync zones'和阻塞信号
- c++ boost asio sync写入async_receive处理程序
- filebuf::sync在输入缓冲区上做什么
- 在boost iostream filtering_ostream中,sync(), strict_sync()和flu
- 关于fstream缓冲区,flush()和sync()的区别是什么?