第七十四课、多线程间的同步------------------狄泰软件学院
一、多线程间的同步
1、多线程编程的本质
(1)、并发性是多线程编程的本质
(2)、在宏观上,所有线程并行执行
(3)、多个线程间相互独立,互不干涉
2、特殊情况下,多线程存在依赖
煮菜和煮饭这两个线程结束后,才能进行吃饭的线程
3、同步的概念
(1)、在特殊情况下,控制多线程间的相对执行顺序
(2)、QThread类支持线程间的同步
#include <QCoreApplication> #include <QThread> #include <QDebug> /* * 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(); }
二、小结
(1)、在默认情况下,各个线程独立存在,并行执行
(2)、在特殊情况下,多线程的执行在时序上存在依赖
(3)、QThread类直接支持线程间的同步,(wait()成员函数)
(4)、wait()停止当前线程的执行,等待目标线程执行结束