c++ - QMutex 访问共享变量

标签 c++ qt mutex

从不同的线程写入共享变量,我计划使用 QMutex,如果我将互斥变量声明为外部变量,我可以使用它在来自不同源文件的单独两个函数中进行读写吗?

喜欢

header.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();
}

基本上我需要的是一次只有一个线程访问共享变量进行读取或写入,在这种情况下我可以这样使用互斥量吗?

任何帮助将不胜感激.. 谢谢 哈里斯

最佳答案

是的,原则是正确的(假设你打算写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)而不是变量+互斥对。

关于c++ - QMutex 访问共享变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31071977/

相关文章:

c++ - cudaModuleLoadData 失败,错误代码为 201

c++ - Qt 5.6 - 如何将 QTreeWidget 链接到主窗口?

c++ - func ("") 导致“重载 QChar(const char[2]) 的调用不明确

c - 如何保护 isr 和常规函数共享的全局变量?

c++ - C++中的动态源代码

c++ - windows.h 的 Beep() 的更快替代品

c++ - 错误 : expected `;' before '{' token - What is the cause?

android - 在 Android 中同时使用两个 MouseArea

multithreading - C++ std::mutex和Windows CreateMutex有什么区别

临界区中的 C++ 异常处理(pthreads)