




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、1,多線程編程,2,線程概述 線程的基本操作 線程同步互斥,3,每個進(jìn)程都擁有自己的數(shù)據(jù)段、代碼段和堆棧段,這就造成進(jìn)程在進(jìn)行創(chuàng)建、切換、撤銷操作時,需要較大的系統(tǒng)開銷。 為了減少系統(tǒng)開銷,從進(jìn)程中演化出了線程。 線程存在于進(jìn)程中,共享進(jìn)程的資源。 線程是進(jìn)程中的獨(dú)立控制流,由環(huán)境(包括寄存器組和程序計(jì)數(shù)器)和一系列的執(zhí)行指令組成。,4,線程的概念 每個進(jìn)程有一個地址空間和一個控制線程。,5,線程和進(jìn)程的比較 調(diào)度 線程是CPU調(diào)度和分派的基本單位。 擁有資源: 進(jìn)程是系統(tǒng)中程序執(zhí)行和資源分配的基本單位。 線程自己一般不擁有資源(除了必不可少的程序計(jì)數(shù)器,一組寄存器和棧),但它可以去訪問其所屬
2、進(jìn)程的資源,如進(jìn)程代碼段,數(shù)據(jù)段以及系統(tǒng)資源(已打開的文件,I/O設(shè)備等)。,6,系統(tǒng)開銷 同一個進(jìn)程中的多個線程可共享同一地址空間,因此它們之間的同步和通信的實(shí)現(xiàn)也變得比較容易。 在進(jìn)程切換時候,涉及到整個當(dāng)前進(jìn)程CPU環(huán)境的保存以及新被調(diào)度運(yùn)行的進(jìn)程的CPU環(huán)境的設(shè)置;而線程切換只需要保存和設(shè)置少量寄存器的內(nèi)容,并不涉及存儲器管理方面的操作,從而能更有效地使用系統(tǒng)資源和提高系統(tǒng)的吞吐量。 并發(fā)性 不僅進(jìn)程間可以并發(fā)執(zhí)行,而且在一個進(jìn)程中的多個線程之間也可以并發(fā)執(zhí)行。,7,使用多線程的目的主要有以下幾點(diǎn): 多任務(wù)程序的設(shè)計(jì) 一個程序可能要處理不同應(yīng)用,要處理多種任務(wù),如果開發(fā)不同的進(jìn)程來處理
3、,系統(tǒng)開銷很大,數(shù)據(jù)共享,程序結(jié)構(gòu)都不方便,這時可使用多線程編程方法。 并發(fā)程序設(shè)計(jì) 一個任務(wù)可能分成不同的步驟去完成,這些不同的步驟之間可能是松散耦合,可能通過線程的互斥,同步并發(fā)完成。這樣可以為不同的任務(wù)步驟建立線程。,8,網(wǎng)絡(luò)程序設(shè)計(jì) 為提高網(wǎng)絡(luò)的利用效率,我們可能使用多線程,對每個連接用一個線程去處理。 數(shù)據(jù)共享 同一個進(jìn)程中的不同線程共享進(jìn)程的數(shù)據(jù)空間,方便不同線程間的數(shù)據(jù)共享。 在多CPU系統(tǒng)中,實(shí)現(xiàn)真正的并行。,9,線程的基本操作,就像每個進(jìn)程都有一個進(jìn)程號一樣,每個線程也有一個線程號。 進(jìn)程號在整個系統(tǒng)中是唯一的,但線程號不同,線程號只在它所屬的進(jìn)程環(huán)境中有效。 進(jìn)程號用pid
4、_t數(shù)據(jù)類型表示,是一個非負(fù)整數(shù)。線程號則用pthread_t數(shù)據(jù)類型來表示。 有的系統(tǒng)在實(shí)現(xiàn)pthread_t的時候,用一個結(jié)構(gòu)體來表示,所以在可移植的操作系統(tǒng)實(shí)現(xiàn)不能把它做為整數(shù)處理。,10,#include int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg); 功能: 創(chuàng)建一個線程。,11,參數(shù): thread:線程標(biāo)識符地址。 attr:線程屬性結(jié)構(gòu)體地址。 start_routine:線程函數(shù)的入口地址。 arg:傳給線
5、程函數(shù)的參數(shù)。 返回值: 成功:返回0。 失?。悍祷胤?。,12,與fork不同的是pthread_create創(chuàng)建的線程不與父線程在同一點(diǎn)開始運(yùn)行,而是從指定的函數(shù)開始運(yùn)行,該函數(shù)運(yùn)行完后,該線程也就退出了。 線程依賴進(jìn)程存在的,如果創(chuàng)建線程的進(jìn)程結(jié)束了,線程也就結(jié)束了。 線程函數(shù)的程序在pthread庫中,故鏈接時要加上參數(shù)-lpthread。 例:01_pthread_create_1.c 01_pthread_create_2.c,13,#include int pthread_join(pthread_t thread, void *retval); 功能: 等待子線程結(jié)束,并回收子
6、線程資源。 參數(shù): thread:被等待的線程號。 retval:用來存儲線程退出狀態(tài)的指針的地址。 返回值: 成功返回0,失敗返回非0。 例:02_pthread_join.c,14,創(chuàng)建一個線程后應(yīng)回收其資源,但使用pthread_join函數(shù)會使調(diào)用者阻塞,故Linux提供了線程分離函數(shù):pthread_detach。,15,#include int pthread_detach(pthread_t thread); 功能: 使調(diào)用線程與當(dāng)前進(jìn)程分離,使其成為一個獨(dú)立的線程,該線程終止時,系統(tǒng)將自動回收它的資源。 參數(shù): thread:線程號 返回值: 成功:返回0,失敗返回非0。 例:
7、03_pthread_detach.c,16,在進(jìn)程中我們可以調(diào)用exit函數(shù)或_exit函數(shù)來結(jié)束進(jìn)程,在一個線程中我們可以通過以下三種在不終止整個進(jìn)程的情況下停止它的控制流。 線程從執(zhí)行函數(shù)中返回。 線程調(diào)用pthread_exit退出線程。 線程可以被同一進(jìn)程中的其它線程取消。,17,#include void pthread_exit(void *retval); 功能: 退出調(diào)用線程。 參數(shù): retval:存儲線程退出狀態(tài)的指針。 注: 一個進(jìn)程中的多個線程是共享該進(jìn)程的數(shù)據(jù)段,因此,通常線程退出后所占用的資源并不會釋放。 例:04_pthread_exit.c,18,取消線程是指
8、取消一個正在執(zhí)行線程的操作。 #include int pthread_cancel(pthread_t thread); 功能: 取消線程。 參數(shù): thread:目標(biāo)線程ID。 返回值: 成功返回0,失敗返回出錯編號。,19,pthread_cancel函數(shù)的實(shí)質(zhì)是發(fā)信號給目標(biāo)線程thread,使目標(biāo)線程退出。 此函數(shù)只是發(fā)送終止信號給目標(biāo)線程,不會等待取消目標(biāo)線程執(zhí)行完才返回。 然而發(fā)送成功并不意味著目標(biāo)線程一定就會終止,線程被取消時,線程的取消屬性會決定線程能否被取消以及何時被取消。 線程的取消狀態(tài) 線程取消點(diǎn) 線程的取消類型,20,線程的同步互斥,同步: 兩個或兩個以上的線程在運(yùn)行過
9、程中協(xié)同步調(diào),按預(yù)定的先后次序運(yùn)行。 互斥: 一個公共資源同一時刻只能被一個線程使用,多個線程不能同時使用公共資源。POSIX標(biāo)準(zhǔn)中線程同步和互斥的方法,主要有信號量和互斥鎖兩種方式。,21,互斥鎖(mutex) mutex是一種簡單的加鎖的方法來控制對共享資源的訪問,mutex只有兩種狀態(tài),即上鎖(lock)和解鎖(unlock)。 在訪問該資源前,首先應(yīng)申請mutex,如果mutex處于unlock狀態(tài),則會申請到mutex并立即lock;如果mutex處于lock狀態(tài),則默認(rèn)阻塞申請者。 unlock操作應(yīng)該由lock者進(jìn)行。,22,mutex用pthread_mutex_t數(shù)據(jù)類型表示
10、,在使用互斥鎖前,必須先對它進(jìn)行初始化。 靜態(tài)分配的互斥鎖: pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 動態(tài)分配互斥鎖: pthread_mutex_t mutex; pthread_mutex_init(在所有使用過此互斥鎖的線程都不再需要使用時候,應(yīng)調(diào)用pthread_mutex_destroy銷毀互斥鎖。,23,#include int pthread_mutex_init( pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); 功能: 初始化一個互斥鎖。 參數(shù): m
11、utex:互斥鎖地址。 attr:互斥鎖的屬性,NULL為默認(rèn)的屬性。 返回值: 成功返回0,失敗返回非0。,24,#include int pthread_mutex_lock(pthread_mutex_t *mutex); 功能: 對互斥鎖上鎖,若已經(jīng)上鎖,則調(diào)用者一直阻塞到互斥鎖解鎖。 參數(shù): mutex:互斥鎖地址。 返回值: 成功返回0,失敗返回非0。,25,#include int pthread_mutex_trylock( pthread_mutex_t *mutex); 功能: 對互斥鎖上鎖,若已經(jīng)上鎖,則上鎖失敗,函數(shù)立即返回。 參數(shù): mutex:互斥鎖地址。 返回值:
12、 成功返回0,失敗返回非0。,26,#include int pthread_mutex_unlock( pthread_mutex_t * mutex); 功能: 對指定的互斥鎖解鎖。 參數(shù): mutex:互斥鎖地址。 返回值: 成功返回0,失敗返回非0。,27,#include int pthread_mutex_destroy( pthread_mutex_t *mutex); 功能: 銷毀指定的一個互斥鎖。 參數(shù): mutex:互斥鎖地址。 返回值: 成功返回0,失敗返回非0。 例:07_pthread_mutex.c,28,信號量廣泛用于進(jìn)程或線程間的同步和互斥,信號量本質(zhì)上是一個非
13、負(fù)的整數(shù)計(jì)數(shù)器,它被用來控制對公共資源的訪問。 編程時可根據(jù)操作信號量值的結(jié)果判斷是否對公共資源具有訪問的權(quán)限,當(dāng)信號量值大于時,則可以訪問,否則將阻塞。,29,原語是對信號量的操作,一次操作使信號量sem減,一次操作使信號量sem加。 信號量主要用于進(jìn)程或線程間的同步和互斥這兩種典型情況。 若用于互斥,幾個進(jìn)程(或線程)往往只設(shè)置一個信號量。 若用于同步操作,往往會設(shè)置多個信號量,并且安排不同的初始值,來實(shí)現(xiàn)它們之間的執(zhí)行順序。,30,信號用于互斥,31,信號量用于同步,32,#include int sem_init(sem_t *sem, int pshared, unsigned in
14、t value); 功能: 創(chuàng)建一個信號量并初始化它的值。 參數(shù): sem:信號量的地址。 pshared:等于0,信號量在線程間共享;不等于0,信號量在進(jìn)程間共享。 value:信號量的初始值。 返回值: 成功返回0,失敗返回-1。,33,#include int sem_wait(sem_t *sem); 功能: 將信號量的值減1,若信號量的值小于0,此函數(shù)會引起調(diào)用者阻塞。 參數(shù): sem:信號量地址。 返回值: 成功返回0,失敗返回-1。,34,#include int sem_trywait(sem_t *sem); 功能: 將信號量的值減1,若信號量的值小于0,則對信號量的操作失敗
15、,函數(shù)立即返回。 參數(shù): sem:信號量地址。 返回值: 成功返回0,失敗返回-1。,35,#include int sem_post(sem_t *sem); 功能: 將信號量的值加1并發(fā)出信號喚醒等待線程。 參數(shù): sem:信號量地址。 返回值: 成功返回0,失敗返回-1。,36,#include int sem_getvalue(sem_t *sem, int *sval); 功能: 獲取sem標(biāo)識的信號量的值,保存在sval中。 參數(shù): sem:信號量地址。 sval:保存信號量值的地址。 返回值: 成功返回0,失敗返回-1。,37,#include int sem_destroy(sem_t
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 軟件升級及維護(hù)合同
- 交通協(xié)管員聘用合同協(xié)議書
- 家禽購銷合同
- 貨品抵款結(jié)算協(xié)議書
- 應(yīng)對市場變化的解決方案研究
- 蘭州房屋租賃合同
- 機(jī)械租賃協(xié)議合同
- 第19課 治學(xué)須有疑無疑不成學(xué)-《懷疑與學(xué)問》(教學(xué)設(shè)計(jì))九年級語文上冊同步高效課堂(統(tǒng)編版)
- 第一單元學(xué)習(xí)任務(wù)《如何闡述自己的觀點(diǎn)》教學(xué)設(shè)計(jì) 2023-2024學(xué)年統(tǒng)編版高中語文必修下冊
- Unit 4 Fun with numbers 第二課時(教學(xué)設(shè)計(jì))-2024-2025學(xué)年外研版(三起)(2024)英語三年級上冊
- JJF 1176-2024(0~2 300) ℃鎢錸熱電偶校準(zhǔn)規(guī)范
- 8.4+同一直線上二力的合成課件+2024-2025學(xué)年人教版物理八年級下冊
- 2024年河北省邢臺市公開招聘警務(wù)輔助人員(輔警)筆試專項(xiàng)訓(xùn)練題試卷(2)含答案
- 地質(zhì)災(zāi)害防治工程施工技術(shù)要點(diǎn)課件
- 防涉黃課件教學(xué)課件
- 家政公司服務(wù)員考試題庫單選題100道及答案解析
- 人工智能:AIGC基礎(chǔ)與應(yīng)用 課件 實(shí)訓(xùn)項(xiàng)目九 使用度加創(chuàng)作工具和剪映進(jìn)行智能化短視頻創(chuàng)作
- 企業(yè)人才招聘與選拔方法論研究
- 《日影的朝向及長短》課件
- 中職普通話教師教案模板
- 施工后期的場地恢復(fù)措施
評論
0/150
提交評論