返回介绍

QMutex类

发布于 2019-10-04 15:01:45 字数 2129 浏览 1061 评论 0 收藏 0

QMutex类提供的是线程之间的访问顺序化。 详情请见……

#include <qmutex.h>

所有成员函数的列表。

公有成员

  • QMutex ( boolrecursive = FALSE )
  • virtual ~QMutex ()
  • void lock ()
  • void unlock ()
  • bool locked ()
  • bool tryLock ()

详细描述

QMutex类提供的是线程之间的访问顺序化。

QMutex的目的是保护一个对象、数据结构或者代码段,所以同一时间只有一个线程可以访问它。(在Java术语中,它和同步关键字“synchronized”很相似)。例如,这里有一个方法打印给用户两条消息:

  void someMethod()
  {
     qDebug("Hello");
     qDebug("World");
  }
  

如果同时在两个线程中调用这个方法,结果的顺序将是:

  Hello
  Hello
  World
  World
  

如果你使用了一个互斥量:

  QMutex mutex;

  void someMethod()
  {
     mutex.lock();
     qDebug("Hello");
     qDebug("World");
     mutex.unlock();
  }
  

用Java的术语,这段代码应该是:

  void someMethod()
  {
     synchronized {
       qDebug("Hello");
       qDebug("World");
     }
  }
  

然后同一时间只有一个线程可以运行someMethod并且消息的顺序也一直是正确的。当然,这只是一个很简单的例子,但是它适用于任何需要按特定频率发生的情况。

但你在一个线程中调用lock(),其它线程将会在同一地点试图调用lock()来阻塞,知道这个线程调用unlock()之后其它线程才会获得这个锁。lock()的一种非阻塞选择是tryLock()。

也可以参考环境类和线程类。


成员函数文档

QMutex::QMutex ( boolrecursive = FALSE )

构造一个新的互斥量。这个互斥量是在没有锁定的状态下创建的。如果recursive为真,就构造一个递归互斥量,如果recursive为假(默认值),就构造一个普通互斥量。对于一个递归互斥量,一个线程可以锁定一个互斥量多次并且只有在相同数量的unlock()调用之后,它才会被解锁。

QMutex::~QMutex () [虚]

销毁这个互斥量。

void QMutex::lock ()

试图锁定互斥量。如果另一个线程已经锁定这个互斥量,那么这次调用将阻塞直到那个线程把它解锁。

也可以参考unlock()和locked()。

bool QMutex::locked ()

如果互斥量被另一个线程锁定了,返回真,否则返回假。

警告:由于不同平台上递归互斥量的实现不同,所以从以前锁定这个互斥量的同一个线程上调用这个函数可能会返回未定义的结果。

也可以参考lock()和unlock()。

bool QMutex::tryLock ()

试图锁定互斥量。如果锁被得到,这个函数返回真。如果另一个进程已经锁定了这个互斥量,这个函数返回假,而不是一直等到这个锁可用为止,比如,它不是阻塞的。

在另一个线程可以成功锁定它之前,这个锁必须被调用unlock()来解锁。

也可以参考lock()、unlock()和locked()。

void QMutex::unlock ()

解锁这个互斥量。试图对不同的线程中锁定的互斥量进行解锁将会返回一个错误。对一个没有锁定的互斥量进行解锁的结果是将导致未定义的行为(不同的操作系统的线程实现是有很大不同的)。

也可以参考lock()和locked()。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文