首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QMutex访问共享变量

QMutex访问共享变量
EN

Stack Overflow用户
提问于 2015-06-26 11:23:52
回答 1查看 540关注 0票数 0

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

喜欢

header.hpp

代码语言:javascript
复制
extern QMutex mutex;
extern int  data;

src1.cpp //在一个线程中

代码语言:javascript
复制
int read(){
  int tmp;
  mutex.lock();
  tmp=data;
  mutex.unlock();
  return tmp;
}

src2.cpp //在另一个线程中

代码语言:javascript
复制
void write(int val){
  mutex.lock();
  data=val;
  mutex.unlock();
}

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

任何帮助都将不胜感激..。谢谢哈利斯

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-26 11:29:38

是的,这个原则是正确的(假设您打算编写return tmp;而不是return data;)。不要忘记在一个源文件中同时定义mutexdata (它们可以位于同一个文件中,也可以在不同的源文件中)。

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

代码语言:javascript
复制
int read()
{
  QMutexLocker l(&mutex);
  return data;
}

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

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

另外,如果您所保护的数据实际上只是一个int,那么最好使用原子变量(如QAtomicInt)而不是variable+mutex对。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31071977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档