QMutex Access共享变量

QMutex Access shared variable

本文关键字:共享变量 Access QMutex      更新时间:2023-10-16

从不同线程写入共享变量,我计划使用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;)。不要忘记在一个源文件中定义mutexdata(它们可以在同一个文件中,也可以分别在不同的文件中)。

然而,通常最好使用RAII类(互斥锁),而不是使用这些类显式锁定和解锁,代码如下所示:

int read()
{
  QMutexLocker l(&mutex);
  return data;
}
void write(int val)
{
  QMutexLocker l(&mutex);
  data = val;
}

互斥锁将互斥锁锁定在其构造函数中,并在其析构函数中再次解锁(当l超出作用域时会自动调用)。这样,即使存在异常,也永远不会忘记解锁互斥锁。


附带说明一下,如果您保护的数据实际上只是一个int,那么您最好使用原子变量(如QAtomicInt),而不是变量+互斥对。