1. 多线程编程的本质
(1)并发性是多线程编程的本质
(2)在宏观上,所有线程并行执行。但微观上线程仍是按一定的顺序串行地执行。
(3)多个线程间相对独立,互不干涉。
2. 串行解决方案和并行解决方案
(1)问题提出
(2)两种解决方案
3. 线程的同步
(1)同步的概念:在特殊情况下,控制多线程间的相对执行顺序
(2)线程间可能存在时序上的依赖
(2)QThread类直接支持线程间的同步
bool QThread::wait(unsigned long time = ULONG_MAX)
QThread t; t.start(); //启动子线程 t.wait(); //等待子线程执行结束。(注意,会阻塞当前线程,而不是子线程,应该理解成wait t)
【编程实验】求各计算的串行解决方案和并行解决方案
#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(); }
4. 小结
(1)在默认情况下,各个线程独立存在,并行执行。
(2)在特殊情况下,多线程的执行在时序上存在依赖
(3)QThread类直接支持线程间的同步(wait成员函数)
(4)wait()阻塞当前线程的执行,等待目标线程执行结束。
原文:http://www.cnblogs.com/5iedu/p/6280258.html