


版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、第 4 章 線程管理與控制線程概念簡介每個進程都擁有自己的數(shù)據(jù)段、代碼段和堆棧段,這就造成了進程在進行切 換等操作時都需要有比較復雜的上下文切換等動作 。為了進一步減少處理機的空 轉時間,支持多處理器以及減少上下文切換開銷,進程在演化中出現(xiàn)了另一個概 念線程。它是進程內(nèi)獨立的一條運行路線,處理器調(diào)度的最小單元,也可以 稱為輕量級進程。 線程可以對進程的內(nèi)存空間和資源進行訪問,并與同一進程中 的其他線程共享。因此,線程的上下文切換的開銷比創(chuàng)建進程小很多。 同進程一樣, 線程也將相關的執(zhí)行狀態(tài)和存儲變量放在線程控制塊 (TCB)內(nèi)。一個 進程可以有多個線程,也就是有多個線程控制塊及堆棧寄存器,但卻
2、共享一個用 戶地址空間。 要注意的是,由于線程共享了進程的資源和地址空間,因此,任何 線程對系統(tǒng)資源的操作都會給其他線程帶來影響。由此可知,多線程中的同步是 非常重要的問題。在多線程系統(tǒng)中,進程與進程的關系如圖所示。進程用戶地址空間線程一 線程二 線程三進程與線程關系4.2 Linux 多線程編程 API 與實驗任務Linux 多線程編程 API創(chuàng)建線程 pthread_create() 函數(shù)實際上就是確定調(diào)用該線程函數(shù)的入口 點,在線程創(chuàng)建以后,就開始運行相關的線程函數(shù),在該函數(shù)運行完之后,該線 程也就退出了,這也是線程退出一種方法。另一種退出線程的方法是使用函數(shù) pthread_exit(
3、) ,這是線程的主動行為。這里要注意的是,在使用線程函數(shù)時, 不能隨意使用 exit() 退出函數(shù)進行出錯處理,由于 exit() 的作用是使調(diào)用進程 終止,往往一個進程包含多個線程,因此,在使用 exit() 之后,該進程中的所 有線程都終止了。因此,在線程中就可以使用 pthread_exit() 來代替進程中的 exit() 。由于一個進程中的多個線程是共享數(shù)據(jù)段的, 因此通常在線程退出之后, 退出線程所占用的資源并不會隨著線程的終止而得到釋放。正如進程之間可 以用 wait() 系統(tǒng)調(diào)用來同步終止并釋放資源 一樣,線程之間也有類似機制, 那就是 pthread_join() 函數(shù)。 p
4、thread_join() 可以用于將當前線程掛起來等 待線程的結束。這個函數(shù)是一個線程阻塞的函數(shù),調(diào)用它的函數(shù)將一直等待 到被等待的線程結束為止,當函數(shù)返回時,被等待線程的資源就被收回。 ( 1)創(chuàng)建線程函數(shù) pthread_create() 功能:創(chuàng)建線程和啟動線程,與進程管理函數(shù) fork() 的功能相似。pthread_create() 函數(shù)語法要點所需頭文件#include <>函數(shù)原型int pthread_create (pthread_t *thread, pthread_attr_t*attr,void *(*start_routine)(void *), voi
5、d *arg)函數(shù)傳入值thread :線程標識符attr :線程屬性設置(其具體設置參見小節(jié)) ,通常取為 NULLstart_routine :線程函數(shù)的起始地址,是一個以指向 void 的指針作為 參數(shù)和返回值的函數(shù)指針arg :傳遞給 start_routine 的參數(shù)函數(shù)返回值成功: 0出錯:返回錯誤碼(2) 線程退出函數(shù) pthread_exit()pthread_exit() 函數(shù)語法要點所需頭文件#include <>函數(shù)原型void pthread_exit(void *retval)函數(shù)傳入值retval :線程結束時的返回值,可由其他函數(shù)如 獲取pthread
6、_join() 來(3) 等待線程結束函數(shù) pthread_join() 等待線程結束,讀取線程的返回結果。pthread_join() 函數(shù)語法要點所需頭文件#include <>函數(shù)原型int pthread_join (pthread_t th, void *thread_return)th :等待線程的標識符函數(shù)傳入值thread_return :用戶定義的指針, 用來存儲被等待線程結束時的返回值 (不為 NULL時)函數(shù)返回值成功: 0出錯:返回錯誤碼(4) 線程取消函數(shù) pthread_cancel()pthread_cancel() 函數(shù)語法要點所需頭文件#inclu
7、de <>函數(shù)原型int pthread_cancel(pthread_t th)函數(shù)傳入值th :要取消的線程的標識符函數(shù)返回值成功: 0出錯:返回錯誤碼Linux 多線程同步 API1. 線程同步信號量及系統(tǒng)調(diào)用POSIX的線程同步信號量定義了 3 個函數(shù):(1) 信號量初始化函數(shù)說明:#include <>int sem_init(sem_t *sem,int pshared,unsigned value); 參數(shù)說明:sem: 指向信號量變量的指針, *sem 是定義好的信號量pshared: 為 0 表示進程局部信號量,通常為 0value: 信號量初始值,為
8、 1 時是二值信號量 返回值:0:執(zhí)行成功,非 0 執(zhí)行失敗(2) 信號量加 1 原子操作int sem_post(sem_t *sem);說明:類似于進程的 V 操作。(3) 信號量減 1 原子操作int sem_wait(sem_t *sem)說明:在信線程號量值為 0 時執(zhí)行該操作使線程進入等待狀態(tài), 直到另一個線程執(zhí) 行加 1 原子操作為止。類似于進程的 P操作。2. 線程互斥量及系統(tǒng)調(diào)用互斥量可在多線程程序中作為臨界區(qū)互斥訪問手段。操作互斥量的基本函數(shù) 有:(1) 初始化函數(shù)函數(shù)說明:#include <>int phread_mutex_init(pthread_mut
9、ex_t *mutex,const pthread_mutexattr_t *mutexattr);參數(shù)說明:mutex: 定義好的互斥量指針mutexattr :互斥量屬性,通??梢詾?NULL(2) 加鎖操作int pthread_mutex_lock(pthread_mutex_t *mutex);(3) 開鎖操作int pthread_mutex_unlock(pthread_mutex_t *mutex);(4) 互斥量撤銷操作int pthread_mutex_destroy(pthread_mutex_t *mutex);Linux 多線程同步實驗任務1. 用互斥量實現(xiàn)對中多線程
10、并發(fā)程序中共享變量的互斥訪問#include <>#include <> #include <> static int a10000;static sum1,sum2,sum, p; pthread_mutex_t mutex; .n");return -1;sum1=0;for(; ;) pthread_mutex_lock (&mutex);if (p<10000) sum1=sum1+ap;usleep(1);p+;pthread_mutex_unlock(&mutex);else pthread_mutex_unloc
11、k(&mutex); break;pthread_join(tidp,&thread_result);sum=sum1+sum2;printf("the sum of array10000 is %dn",sum);printf("the part sum of thread1 get is %dn", thread_result);return 0;$ gcc -lpthread -o lin-thread-4 $ ./lin-thread-42. 分析、調(diào)試和執(zhí)行一個多線程示例程序該程序創(chuàng)建兩個線程, 一個線程負責讀入鍵盤輸入的文本,
12、 另一個線程負責 統(tǒng)計和顯示輸入的字符個數(shù),文本輸入以“ end”表示輸入結束。程序在主線程 中對結束的兩個線程進行歸并。void *input_text(void *arg);void *count_text(void *arg);void *stat text(void *arg);sem_t bin_sem; Enter end' to finishn");while(strncmp("end",work_area,3)!=0) fgets(work_area,WORK_SIZE,stdin); sem_post(&bin_sem); /*
13、產(chǎn)生事件 */pthread_exit(0);void *stat_text(void *arg) sem_wait(&bin_sem); /* 等待事件 */ while(strncmp("end",work_area,3)!=0) printf("You input %d charactersn",strlen(work_area)-1); sem_wait(&bin_sem);pthread_exit(NULL);$ gcc -D_REENTRANT -o lin-thread-5 -lpthread$ ./ lin-thread-5Input some text. Enter vendr to finish Waiting for thread to finish.endThreads j oineciFile Edit iew Terminal Tabs Helpcarftbuntu; VoxleS vim 1 in-thread-5. ccai4li>untu: Vcode gee 1 m-thread-5. c -1 pthread
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 家用紡織品的產(chǎn)品差異化與競爭優(yōu)勢考核試卷
- 智能車載設備的故障預測考核試卷
- 工藝美術品的商業(yè)模式創(chuàng)新考核試卷
- 專業(yè)技術培訓引領行業(yè)變革考核試卷
- 家居裝飾裝修中的施工質量控制考核試卷
- 城市軌道交通的旅客負擔與收入分析考核試卷
- 技術標準制定考核試卷
- 工業(yè)控制計算機在電力系統(tǒng)的應用考核試卷
- 學校租賃土地合同范本
- 公司并購簽約合同范本
- 2025年湖南城建職業(yè)技術學院單招職業(yè)技能測試題庫新版
- 企業(yè)級軟件開發(fā)作業(yè)指導書
- 《中國古代文學史及作品選II》教學大綱
- 代工生產(chǎn)合同范本
- 人教版英語2025七年級下冊 Unit1Animal Friends教師版 語法講解+練習
- DeepSeek新手入門教程
- 課件:《教育強國建設規(guī)劃綱要(2024-2035年)》學習宣講
- 2025年上海市商品交易市場進場經(jīng)營合同(2篇)
- 2025年全國幼兒園教師資格證考試教育理論知識押題試題庫及答案(共九套)
- 2024年鄭州電力高等??茖W校高職單招職業(yè)適應性測試歷年參考題庫含答案解析
- 產(chǎn)品試產(chǎn)流程
評論
0/150
提交評論