QT多线程同步之QWaitcondition
使用到多线程,无可避免的会遇到同步问题,qt提供几种同步线程的方法,在这里讲一下QWaitcondition的简单使用。
一、QWaitcondition,是通过一个线程达到某种条件来唤起另一个线程来实现同步的
mutex.lock();
waitcondition.wait(&mutex);
需要用到一个互斥量作为参数,而这个互斥量的状态必须是locked的。
当调用这一句waitcondition.wait(&mutex) 在等待触发条件的时候,此时的mutex已经被设置为unlocked状态。当条件满足wait语句朝下执行的时候
mutex又被设置为locked状态
二、看看具体实例
mutex.lock();
int a,b,c;
a =10;
b= 2;
c = 7;
qDebug()<<"usedSpace"<<usedSpace;
//if(usedSpace == BufferSize)
waitcondition.wait(&mutex);
当多个线程执行这段代码时,从微观的角度看,线程会在三处阻塞等待资源,第一个是mutex.lock语句处。第二个会在waitcondition.wait(&mutex);等待。这是因为waitcondition.wait(&mutex);语句相当于
下面三行代码,这样我们就可以看得很清楚
mutex.unlock();
waitcondition.wait(); //线程处于阻塞状态等待信号 注意(unlock和wait是原子的)
mutex.lock(); //这句在wait()等到信号或者超时的情况下执行、唤醒和lock也是原子操作 在wait的时候mutex已经处于unlocked状态.
第三处会在waitcondition.wait(&mutex)拆分语句里面的mutex.lock()处。
大家可能会因为如果线程都在wait处等待,还能不能保证上图1处是临界区(假设有共享变量).其实可以确定的说1处和2处都是临界区,上图整个代码都处于临界区(代码段不会被多个线程同时执行)。
三、详细分析过程
现在我们把时间放慢,放到毫秒级微妙及纳秒级。假设这段代码 同时被多个线程执行,执行开始遇到一地个mutex.lock处,第一个线程获取锁,后续来的所有线程都会在这个地方等待锁资源,当第一个线程wait语句的时候。wait语句执行过程其实是执行
一下三步
mutex.unlock();
waitcondition.wait();
mutex.lock();//这句在wait()等到信号或者超时的情况下执行
这个时候第一个线程会释放锁资源,自己处于条件等待状态。那么在上面等待锁资源的第二个线程将会获得所资源,然后有执行到wait处,以此类推 第三
第四、第五线程一次获得锁资源,最后所有线程都会等待在wait处。
当条件变量满足条件被其他线程唤醒的时候即执行wakeall或者wakeone.执行wakeall的时候所有等待线程都会被唤醒,继续往下执行,那么大家担心以后的语句即2处会不会有同步问题呢?不会,因为每个线程唤醒后第一个线程(或者说其中有一个线程)
获取mutex锁资源,然后再执行下面的语句,其他被唤醒的线程只能在这个mutex等待锁资源。
整个过程可以理解为
这一段代码多个线程会在多出集结等待资源,但这个代码的执行始终是互斥的。
QT多线程同步之QWaitcondition的更多相关文章
- Qt 多线程同步与通信
Qt 多线程同步与通信 1 多线程同步 Qt提供了以下几个类来完成这一点:QMutex.QMutexLocker.QSemphore.QWaitCondition. 当然可能还包含QReadWrite ...
- Qt多线程同步总结
1.QMutex QMutex mutex; void func() { mutex.lock(); ........ mutex.unlock(); } 2.QMutex联手QMutex ...
- Qt 多线程和网络编程学习
一,Qt多线程类学习 QThread类,开始一个新的线程就是开始执行重新实现QThread::run(),run()是默认现实调用exec(),QThread::start()开始线程的执行,run( ...
- Qt多线程编程总结(一)(所有GUI对象都是线程不安全的)
Qt对线程提供了支持,基本形式有独立于平台的线程类.线程安全方式的事件传递和一个全局Qt库互斥量允许你可以从不同的线程调用Qt方法. 这个文档是提供给那些对多线程编程有丰富的知识和经验的听众的.推荐阅 ...
- Qt 多线程 详细函数说明及其事例
转:http://www.cnblogs.com/hicjiajia/archive/2011/02/03/1948955.html Qt线程类 Qt 包含下面一些线程相关的类:QThread 提供了 ...
- Qt多线程(有详细例子)
Qt线程类 Qt 包含下面一些线程相关的类:QThread 提供了开始一个新线程的方法QThreadStorage 提供逐线程数据存储QMutex 提供相互排斥的锁,或互斥量QMutexLocker ...
- Qt多线程-QtConcurrent并行运算高级API
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-QtConcurrent并行运算高级API 本文地址:http://tec ...
- Qt多线程-QThread
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-QThread 本文地址:http://techieliang.com/2 ...
- 【QT】 Qt多线程的“那些事”
目录 一.前言 二.QThread源码浅析 2.1 QThread类的定义源码 2.2 QThread::start()源码 2.3 QThreadPrivate::start()源码 2.4 QTh ...
随机推荐
- Ubuntu16.04下安装最新版本的CMake
当前最新版CMake为3.9.1.. Ubuntu中更新cmake到最新版本,过程如下: 1. 卸载已经安装的旧版的CMake[非必需] apt-get autoremove cmake 2. 文 ...
- 一句话说明Facbook React证书的矛盾点
这项专利授权说,如果您要使用我们根据这项授权发布的软件,假如您因为专利侵权而提起诉讼,您将失去我们的专利许可.
- 日志框架之Logger
概述 在我们日常的开发中,肯定是少不了要和 Log 打交道,回想一下我们是怎么使用 Log 的:先定义一个静态常量 TAG,TAG 的值通常是当前类的类名,然后在需要打印 Log 的地方,调用 Log ...
- IPV6基础
Pv6与IPv4的区别 Pv6报文与IPv4报文差别就两个地方: 一个是数据链路层(以太网协议)中协议类型,IPv4是0x0800,IPv6是0x86DD 另一个是IPv6 Header是40字节,I ...
- python3.6安装jpype1后引入jpype报“ImportError: numpy.core.multiarray failed to import”问题
jpype是调用java接口的第三方库,通过该库,python可以运行java程序,从而解决一些调用java的问题,比如:java开发的接口,测试时, 有java的加密算法就不用python写一遍重复 ...
- redis(2)事务的订阅与发布
一.shell终端进行事务的订阅与发布(异步) 发布 : publish channel message [root@localhost ~]# redis-cli -p -h 192.168.42. ...
- 反向代理,负载均衡——nginx理论
nginx是什么? nginx是一个强大的web服务器软件,用于处理高并发的http请求和作为反向代理服务器做负载均衡.具有高性能.轻量级.内存消耗少,强大的负载均衡能力等优势. nginx架构? ...
- python web开发flask框架 安装与环境
# encoding:utf-8 # 从flask这个框架中导入Flask这个类 from flask import Flask # 初始化一个Flask对象 # Flasks() # 需要传递一个参 ...
- NLP之中文自然语言处理工具库:SnowNLP(情感分析/分词/自动摘要)
一 安装与介绍 1.1 概述 SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个 ...
- vue 导出JSON数据为Excel
1. 安装三个依赖 npm install file-saver --save npm install xlsx --save npm install script-loader --save-dev ...
