使用到多线程,无可避免的会遇到同步问题,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的更多相关文章

  1. Qt 多线程同步与通信

    Qt 多线程同步与通信 1 多线程同步 Qt提供了以下几个类来完成这一点:QMutex.QMutexLocker.QSemphore.QWaitCondition. 当然可能还包含QReadWrite ...

  2. Qt多线程同步总结

    1.QMutex   QMutex mutex;   void func() { mutex.lock(); ........ mutex.unlock(); }   2.QMutex联手QMutex ...

  3. Qt 多线程和网络编程学习

    一,Qt多线程类学习 QThread类,开始一个新的线程就是开始执行重新实现QThread::run(),run()是默认现实调用exec(),QThread::start()开始线程的执行,run( ...

  4. Qt多线程编程总结(一)(所有GUI对象都是线程不安全的)

    Qt对线程提供了支持,基本形式有独立于平台的线程类.线程安全方式的事件传递和一个全局Qt库互斥量允许你可以从不同的线程调用Qt方法. 这个文档是提供给那些对多线程编程有丰富的知识和经验的听众的.推荐阅 ...

  5. Qt 多线程 详细函数说明及其事例

    转:http://www.cnblogs.com/hicjiajia/archive/2011/02/03/1948955.html Qt线程类 Qt 包含下面一些线程相关的类:QThread 提供了 ...

  6. Qt多线程(有详细例子)

    Qt线程类 Qt 包含下面一些线程相关的类:QThread 提供了开始一个新线程的方法QThreadStorage 提供逐线程数据存储QMutex  提供相互排斥的锁,或互斥量QMutexLocker ...

  7. Qt多线程-QtConcurrent并行运算高级API

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-QtConcurrent并行运算高级API     本文地址:http://tec ...

  8. Qt多线程-QThread

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-QThread     本文地址:http://techieliang.com/2 ...

  9. 【QT】 Qt多线程的“那些事”

    目录 一.前言 二.QThread源码浅析 2.1 QThread类的定义源码 2.2 QThread::start()源码 2.3 QThreadPrivate::start()源码 2.4 QTh ...

随机推荐

  1. TCP层close系统调用的实现分析

    在调用close系统调用关闭套接字时,如果套接字引用计数已经归零,则需继续向上层调用其close实现,tcp为tcp_close:本文仅介绍tcp部分,前置部分请参考本博关于close系统调用的文章: ...

  2. ccf 201712-4 行车路线(70分)

    ccf 201712-4 行车路线 解题思路: 首先Dijkstra是基于贪心算法的,即每一次作出的选择都具有贪心选择性.此题由于有“如果连续走小道,小明的疲劳值会快速增加,连续走s公里小明会增加s2 ...

  3. 8,聚类分析 fenxinhuag

    1.K-Means聚类分析 2.系统聚类分析 样本间常用距离: 类间常用距离: 3.DBSCAN聚类分析

  4. pycloudtag_wordcloud 中英文标签云

    https://study.163.com/course/courseMain.htm?courseId=1006383008&share=2&shareId=400000000398 ...

  5. rest 参数与扩展运算符

    rest 参数与扩展运算符 1.rest 参数 ES6 引入 rest 参数(形式为...变量名),用于获取函数的多余参数,这样就不需要使用arguments对象了.rest 参数搭配的变量是一个数组 ...

  6. 2.oracle数据库:[1]oracle简易客户端安装方法

      准备oracle简易客户端程序,如果没有请到oracle网站下载www.oracle.com,可以下载基本包及其他扩展程序包,例如:如果要使用sqlplus则需要下载sqlplus包,笔者下载了i ...

  7. Java Web开发中路径问题小结(getRequestUrl getContextUrl getServletUrl)

    看以博客感觉不错,分享一下http://www.cnblogs.com/tianguook/archive/2012/08/31/2665755.html (1) Web开发中路径的几个基本概念 假设 ...

  8. 阶段3 3.SpringMVC·_03.SpringMVC常用注解_6 CookieValue注解

    演示 访问服务器会有session.它是一cookie的形式返回给客户端的 拿到的值

  9. kubernetes学习:CKA考试认证(二)

    1. 它题的意思是 在 development 名称空间里面 找到名为 baz的 service 然后通过这个service的selector 找出 对应的pod . 要用   kubectl des ...

  10. linux之文件目录,输入及输出

    文件目录结构 ls 查看文件 ll 查看详细文件 文件和目录被组织成一颗倒置的树状结构 文件系统从根开始,'/' 文件名严格区分大小写 隐藏文件以.开头 文件的分隔符为'/' 文件命名规范 文件字符最 ...