A.進程的概念
a.程序是計算機存儲系統中數據文件
源代碼程序--文本文件,描述程序行爲和功能
可執行程序--二進制文件,直接加載並執行
進程的概念有兩層的概念,在廣義上是指程序關於某個數據集合的一次運行活動,而在俠義上指的是程序被加載到內存中執行後獲得進程
程序與進程的區別體如今程序是硬盤中靜態文件而進程是內存中動態的運行實體
程序與進程的聯繫
1.一個程序可能對應多個進程--一個程序屢次運行,每次運行產生一個進程
2.一個進程可能包含多個程序--一個程序依賴多個其它動態庫
B.線程的概念
1.進程內的一個執行單元’
2.操做系統中一個可調度的實體
3.進程中相對獨立的一個控制流序列
4.執行時的現場數據和其它調度所需的信息
深刻理解線程與進程
1.進程中存在多個線程共享進程資源
2.線程是被調度的執行單元,而進程不是調度單元
3.線程不能脫離進程單度存在,只能依賴於進程運行
4.線程有生命期,有誕生和死亡
5.任意線程均可以建立其它新的線程編程
A.Qt中經過QThread直接支持多線程
1.QThread是一個跨平臺的多線程解決方案
2.QThread以簡潔易用的方式實現多線程編程
QThread中的關鍵成員函數
1.void run()--線程體函數,用於定義線程功能(執行流)
2.void start()--啓動函數,將線程入口地址設爲爲run函數
3.void terminate()--強制性結束線程
QThread編程示例
代碼示例多線程
#include <QCoreApplication> #include <QThread> #include <QDebug> class MyThread : public QThread { protected: void run() { qDebug() << objectName() << " : " << "run() begin"; for(int i=0; i<5; i++) { qDebug() << objectName() << " : " << i; sleep(1); } qDebug() << objectName() << " : " << "run() end"; } }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qDebug() << "main() begin"; MyThread t; t.setObjectName("t"); t.start(); MyThread tt; tt.setObjectName("tt"); tt.start(); for(int i=0; i<100000; i++) { for(int j=0; j<10000; j++) { } } qDebug() << "main() end"; return a.exec(); }
運行結果
生成該結果的緣由主要是由於兩個線程是並行運行的
線程的生命週期併發
多線程編程的本質有三個方面
1.併發性是多線程的本質
2.在宏觀上,全部線程並行執行
3.多喝線程間相互獨立,互不干涉
同步的概念--在特殊狀況下,控制多線程間的相對執行順序
QThread類直接支持線程間的同步-bool QThread::wait(unsigned long time=ULONG_MAX)
wait所起的做用是當一個線程結束再進行下一個線程
代碼示例ide
#include <QCoreApplication> #include <QThread> #include <QDebug> //分3個階段來計算1-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 result() { return m_result; } }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qDebug() << "main begin"; Calculator cal1(1, 300); Calculator cal2(301, 600); Calculator cal3(601, 1000); cal1.setObjectName("cal1"); cal2.setObjectName("cal2"); cal3.setObjectName("cal3"); cal1.start(); cal2.start(); cal3.start(); cal1.wait(); cal2.wait(); cal3.wait(); int result = cal1.result() + cal2.result() + cal3.result(); qDebug() << "result = " << result; qDebug() << "main end"; return a.exec(); }
運行的結果
小結
1.在默認狀況下,各個線程獨立運行,並行執行
2.在特殊狀況下,多線程的執行在時序上存在依賴
3.QThread類直接支持線程間的同步
4.wait()中止當前線程的執行,等待目標線程執行結束函數