一杯清酒邀明月
天下本无事,庸人扰之而烦耳。
posts - 3121,comments - 209,views - 578万

 QMutex类提供的是线程之间的访问顺序化。QMutex的目的是保护一个对象、数据结构或者代码段,所以同一时间只有一个线程可以访问它。

      例如,这里有一个方法打印给用户两条消息:

1 void DebugInfo()
2 {
3      qDebug("ABC");
4      qDebug("DEF");
5 }

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

ABC ABC DEF DEF

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

复制代码
1 QMutex mutex;
2  
3 void DebugInfo()
4 {
5      mutex.lock();
6      qDebug("ABC");
7      qDebug("DEF");
8      mutex.unlock();
9 }
复制代码

  然后同一时间只有一个线程可以运行DebugInfo()并且消息的顺序也一直是正确的。当然,这只是一个很简单的例子,但是它适用于任何需要按特定频率发生的情况。
  但你在一个线程中调用lock(),其它线程将会在同一地点试图调用lock()来阻塞,知道这个线程调用unlock()之后其它线程才会获得这个锁。lock()的一种非阻塞选择是tryLock()。
成员函数:

QMutex::QMutex ( bool recursive = 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()。

posted on   一杯清酒邀明月  阅读(7489)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示