QMutex Access共享变量
QMutex Access shared variable
从不同线程写入共享变量,我计划使用QMutex,如果我将互斥变量声明为外部变量,我可以在不同源文件的单独两个函数中使用它进行读写吗?
像
页眉.hpp
extern QMutex mutex;
extern int data;
src1.cpp//在一个线程中
int read(){
int tmp;
mutex.lock();
tmp=data;
mutex.unlock();
return tmp;
}
src2.cpp//在另一个线程中
void write(int val){
mutex.lock();
data=val;
mutex.unlock();
}
基本上,我需要的是一次只有一个线程访问共享变量进行读取或写入,在这种情况下,我可以用这种方式使用互斥吗?
任何帮助都将不胜感激。。谢谢Haris
是的,原理是正确的(假设您想写return tmp;
而不是return data;
)。不要忘记在一个源文件中定义mutex
和data
(它们可以在同一个文件中,也可以分别在不同的文件中)。
然而,通常最好使用RAII类(互斥锁),而不是使用这些类显式锁定和解锁,代码如下所示:
int read()
{
QMutexLocker l(&mutex);
return data;
}
void write(int val)
{
QMutexLocker l(&mutex);
data = val;
}
互斥锁将互斥锁锁定在其构造函数中,并在其析构函数中再次解锁(当l
超出作用域时会自动调用)。这样,即使存在异常,也永远不会忘记解锁互斥锁。
附带说明一下,如果您保护的数据实际上只是一个int
,那么您最好使用原子变量(如QAtomicInt
),而不是变量+互斥对。
相关文章:
- C++子类共享变量?
- 子目录之间的 CMAKE 共享变量
- 如何在不同的CMakeList.txt之间共享变量?
- OpenMP 任务看不到共享变量的更改
- OpenMP:当我按线程 ID 访问共享变量时,我是否需要一个关键部分
- 多个 OpenMP 线程读取(而不是写入)共享变量的性能成本?
- 在 pthread 中使用共享变量
- 提升线程问题,当一个线程与另一个线程没有相同的副本时如何共享变量?
- C :与多个文件共享变量
- 使用共享变量进行线程处理
- 是否要确保一个线程修改的任何数据类型的共享变量对其他线程可见
- 在派生类之间复制共享变量(浅副本就足够了)
- 为什么跨线程更改共享变量的代码显然没有受到竞争条件的影响
- 从多个线程C 更改共享变量
- 在不同类的对象之间共享变量 (C++)
- 管理多线程应用程序中的共享变量
- C 类共享变量
- 增强多线程和共享变量
- 共享变量和局部变量C++
- QMutex Access共享变量