使用到多线程,无可避免的会遇到同步问题,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等待锁资源。
整个过程可以理解为
这一段代码多个线程会在多出集结等待资源,但这个代码的执行始终是互斥的。
 
 

最新文章

  1. Java实现多线程并发
  2. 在ubuntu上搭建reviewboard
  3. extjs采用fileupload进行文件上传后台实现
  4. MSSQL 2005数据库与SP4补丁安装
  5. [原]Unity3D深入浅出 - 天空盒(Skyboxes)
  6. JAXB - Calling marshal
  7. 渲染统计窗口(Rendering Statistics Window)
  8. SQL函数:小写金额转换成大写
  9. C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码)
  10. 【Java框架型项目从入门到装逼】第二节 - Spring框架 AOP的丧心病狂解说,你喜欢露娜的月下无限连吗?
  11. snmp爆破(python脚本)
  12. js及jsp区别
  13. pycharm修改注释颜色
  14. db2性能优化
  15. 解决FAT32格式U盘安装win10时0x8007000D错误
  16. 计算概论(A)/基础编程练习2(8题)/7:整数的个数
  17. LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS
  18. c++ 替换修改一个文件夹下的所有文件的文件名
  19. C语言写的2048小游戏
  20. hook NtReadVirtualMemory干扰杀软扫描

热门文章

  1. Nginx开启访问日志记录
  2. 利用uniGUI中的TUniPageControl实现多页面
  3. LC 535. Encode and Decode TinyURL
  4. 利用CountDownTimer倒计时的简单使用实现
  5. python接口自动化框架搭建
  6. 为什么能抓到网站https传输的明文密码?------顺便说说“知乎”和“支付宝”的安全性对比
  7. JSON+如何处理JSON字符串
  8. IIS调试
  9. Oracle表概念
  10. 面向服务架构之RPC原理与实例