博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第七十四课、多线程间的同步------------------狄泰软件学院
阅读量:5911 次
发布时间:2019-06-19

本文共 2015 字,大约阅读时间需要 6 分钟。

一、多线程间的同步

1、多线程编程的本质

(1)、并发性是多线程编程的本质

(2)、在宏观上,所有线程并行执行

(3)、多个线程间相互独立,互不干涉

2、特殊情况下,多线程存在依赖

煮菜和煮饭这两个线程结束后,才能进行吃饭的线程

3、同步的概念

(1)、在特殊情况下,控制多线程间的相对执行顺序

(2)、QThread类支持线程间的同步

#include 
#include
#include
/* * sum(n) = 1 + 2 + 3 + ... + n * sum(1000) ==>分解成3个任务 * [1, 1000] = [1, 300] [301, 600] [601, 1000] */class Calculator : public QThread{protected: int m_begin; int m_end; int m_result; void run() { qDebug() << objectName() << " : run() begin"; for(int i=m_begin; i<=m_end; i++) { m_result += i; msleep(10); } qDebug() << objectName() << " : run() end"; }public: Calculator(int begin, int end) { m_begin = begin; m_end = end; m_result = 0; } //模拟串行解决方案 void work() { run(); } int getResult() { return m_result; }};int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); qDebug() << "main begin"; Calculator cal1(1, 300); //任务1 Calculator cal2(301, 600); //任务2 Calculator cal3(601, 1000); //任务3 cal1.setObjectName("cal1"); cal2.setObjectName("cal2"); cal3.setObjectName("cal3"); //模拟串行解决方案(将run函数作为一般的成员函数调用) //cal1.work(); //先完成任务1 //cal2.work(); //再完成任务2 //cal3.work(); //最后完成任务3 //int result = cal1.getResult() + cal2.getResult() + cal3.getResult(); //qDebug() << "result = " << result; //并行解决方案(利用多线程解决) cal1.start(); //启动线程1 cal2.start(); //启动线程2 cal3.start(); //启动线程3 cal1.wait(); //等待线程1结束 cal2.wait(); //等待线程2结束 cal3.wait(); //等待线程3结束 int result = cal1.getResult() + cal2.getResult() + cal3.getResult();//必须等三个子线程结束后再进行结果的相加,否则将出现错误 qDebug() << "result = " << result; qDebug() << "main end"; return a.exec();}
wait()函数的使用

二、小结

(1)、在默认情况下,各个线程独立存在,并行执行

(2)、在特殊情况下,多线程的执行在时序上存在依赖

(3)、QThread类直接支持线程间的同步,(wait()成员函数)

(4)、wait()停止当前线程的执行,等待目标线程执行结束  

转载于:https://www.cnblogs.com/gui-lin/p/6443094.html

你可能感兴趣的文章
hdu 5452(树链刨分)
查看>>
LVM Linear vs Striped Logical Volumes
查看>>
Mysql主从备份和SQL语句的备份
查看>>
DEDECMS之三 首页、列表页怎么调用文章内容
查看>>
iOS开发多线程篇 09 —NSOperation简单介绍
查看>>
WINDOWS下调用GetTokenInformation的奇怪之处--两次调用
查看>>
HDU 5813 Elegant Construction 构造
查看>>
Tomcat就是个容器,一种软件
查看>>
php结合redis实现高并发下的抢购、秒杀功能
查看>>
统计服务连接状况
查看>>
Tomcat编译jsp生成Servlet文件的存放位置
查看>>
Android事件总线(三)otto用法全解析
查看>>
js数组实现不重复插入数据
查看>>
[译]使用 Siesta 处理 Swift 网络请求
查看>>
Android 中的子线程解析
查看>>
aidl跨进程通讯
查看>>
小程序上传图片到七牛云(支持多张上传,预览,删除)
查看>>
spring boot 整合mybatis 无法输出sql的问题
查看>>
为什么要用IPython/Jupyter?
查看>>
数据可视化之 Sankey 桑基图的实现
查看>>