




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、計算機操作系統(tǒng)上機實驗第 PAGE 6 頁 共 NUMPAGES 6 頁實驗6 Linux線程控制背景知識: 線程,是程序執(zhí)行流的最小單元。一個標準的線程由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進程中的一個實體,是被系統(tǒng)獨立調度和分派的基本單位,線程自己不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創(chuàng)建和撤消另一個線程,同一進程中的多個線程之間可以并發(fā)執(zhí)行。由于線程之間的相互制約,致使線程在運行中呈現(xiàn)出間斷性。線程也有就緒、阻塞和運行三種基本狀態(tài)。每一個程序都至少有一個線程,那就是程序本身。線程
2、是程序中一個單一的順序控制流程。在單個程序中同時運行多個線程完成不同的工作,稱為多線程。使用多線程的理由之一是和進程相比,它是一種非常節(jié)儉的多任務操作方式。我們知道,在Linux系統(tǒng)下,啟動一個新的進程必須分配給它獨立的地址空間,建立眾多的數(shù)據(jù)表來維護它的代碼段、堆棧段和數(shù)據(jù)段,這是一種昂貴的多任務工作方式。而運行于一個進程中的多個線程,它們彼此之間使用相同的地址空間,共享大部分數(shù)據(jù),啟動一個線程所花費的空間遠遠小于啟動一個進程所花費的空間,而且,線程間彼此切換所需的時間也遠遠小于進程間切換所需要的時間。據(jù)統(tǒng)計,總的說來,一個進程的開銷大約是一個線程開銷的30倍左右,當然,在具體的系統(tǒng)上,這個
3、數(shù)據(jù)可能會有較大的區(qū)別。使用多線程的理由之二是線程間方便的通信機制。對不同進程來說,它們具有獨立的數(shù)據(jù)空間,要進行數(shù)據(jù)的傳遞只能通過通信的方式進行,這種方式不僅費時,而且很不方便。線程則不然,由于同一進程下的線程之間共享數(shù)據(jù)空間,所以一個線程的數(shù)據(jù)可以直接為其它線程所用,這不僅快捷,而且方便。當然,數(shù)據(jù)的共享也帶來其他一些問題,有的變量不能同時被兩個線程所修改,有的子程序中聲明為static的數(shù)據(jù)更有可能給多線程程序帶來災難性的打擊,這些正是編寫多線程程序時最需要注意的地方。除了以上所說的優(yōu)點外,不和進程比較,多線程程序作為一種多任務、并發(fā)的工作方式,當然有以下的優(yōu)點:1) 提高應用程序響應。
4、這對圖形界面的程序尤其有意義,當一個操作耗時很長時,整個系統(tǒng)都會等待這個操作,此時程序不會響應鍵盤、鼠標、菜單的操作,而使用多線程技術,將耗時長的操作(time consuming)置于一個新的線程,可以避免這種尷尬的情況。2) 使多CPU系統(tǒng)更加有效。操作系統(tǒng)會保證當線程數(shù)不大于CPU數(shù)目時,不同的線程運行于不同的CPU上。3) 改善程序結構。一個既長又復雜的進程可以考慮分為多個線程,成為幾個獨立或半獨立的運行部分,這樣的程序會利于理解和修改。線程函數(shù)進程創(chuàng)建函數(shù)創(chuàng)建線程實際上就是確定調用該線程函數(shù)的入口點,這里通常使用的函數(shù)是pthread_create()。在線程創(chuàng)建以后,就開始運行相關
5、的線程函數(shù),在該函數(shù)運行完之后,該線程也就退出了,這也是線程退出一種方法。所需頭文件#include 函數(shù)原型int pthread_create (pthread_t *thread, pthread_attr_t *attr,void *(*start_routine)(void *), void *arg)函數(shù)傳入值thread:線程標識符attr:線程屬性設置(其具體設置參見9.2.3小節(jié)),通常取為NULLstart_routine:線程函數(shù)的起始地址,是一個以指向void的指針作為參數(shù)和返回值的函數(shù)指針arg:傳遞給start_routine的參數(shù)函數(shù)返回值成功:0出錯:返回錯誤碼
6、進程退出函數(shù)線程退出時使用函數(shù)pthread_exit,是線程的主動行為。注意進程退出時使用exit函數(shù),線程中用pthread_exit替代exit。所需頭文件#include 函數(shù)原型void pthread_exit(void *retval)函數(shù)傳入值retval:線程結束時的返回值,可由其他函數(shù)如pthread_join()來獲取等待函數(shù)(等待一個線程的結束)由于一個進程中的多個線程共享數(shù)據(jù)段,因此通常在線程退出后,退出線程所占用的資源并不會隨線程結束而釋放。所有需要pthread_join函數(shù)來等待線程結束。類似于wait系統(tǒng)調用。所需頭文件#include 函數(shù)原型int pth
7、read_join (pthread_t th, void *thread_return)函數(shù)傳入值th:等待線程的標識符thread_return:用戶定義的指針,用來存儲被等待線程結束時的返回值(不為NULL時)函數(shù)返回值成功:0出錯:返回錯誤碼互斥鎖線程控制互斥鎖是用一種簡單的加鎖方法來控制對共享資源的原子操作。這個互斥鎖只有兩種狀態(tài),也就是上鎖和解鎖,可以把互斥鎖看作某種意義上的全局變量。在同一時刻只能有一個線程掌握某個互斥鎖,擁有上鎖狀態(tài)的線程能夠對共享資源進行操作。若其他線程希望上鎖一個已經(jīng)被上鎖的互斥鎖,則該線程就會掛起,直到上鎖的線程釋放掉互斥鎖為止??梢哉f,這把互斥鎖保證讓每
8、個線程對共享資源按順序進行原子操作?;コ怄i機制主要包括下面的基本函數(shù)?;コ怄i初始化:pthread_mutex_init()互斥鎖上鎖:pthread_mutex_lock()互斥鎖判斷上鎖:pthread_mutex_trylock()互斥鎖接鎖:pthread_mutex_unlock()消除互斥鎖:pthread_mutex_destroy()其中,互斥鎖可以分為快速互斥鎖、遞歸互斥鎖和檢錯互斥鎖。這3種鎖的區(qū)別主要在于其他未占有互斥鎖的線程在希望得到互斥鎖時是否需要阻塞等待??焖冁i是指調用線程會阻塞直至擁有互斥鎖的線程解鎖為止。遞歸互斥鎖能夠成功地返回,并且增加調用線程在互斥上加鎖的次
9、數(shù),而檢錯互斥鎖則為快速互斥鎖的非阻塞版本,它會立即返回并返回一個錯誤信息。默認屬性為快速互斥鎖。所需頭文件#include 函數(shù)原型int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)函數(shù)傳入值mutex:互斥鎖MutexattrPTHREAD_MUTEX_INITIALIZER:創(chuàng)建快速互斥鎖PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP:創(chuàng)建遞歸互斥鎖PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP:創(chuàng)建檢錯互斥鎖
10、函數(shù)返回值成功:0出錯:返回錯誤碼所需頭文件#include 函數(shù)原型int pthread_mutex_lock(pthread_mutex_t *mutex,)int pthread_mutex_trylock(pthread_mutex_t *mutex,)int pthread_mutex_unlock(pthread_mutex_t *mutex,)int pthread_mutex_destroy(pthread_mutex_t *mutex,)函數(shù)傳入值mutex:互斥鎖函數(shù)返回值成功:0出錯:1信號量線程控制信號量也就是操作系統(tǒng)中所用到的PV原子操作,它廣泛用于進程或線程間的同
11、步與互斥。信號量本質上是一個非負的整數(shù)計數(shù)器,它被用來控制對公共資源的訪問。這里先來簡單復習一下PV原子操作的工作原理。PV原子操作是對整數(shù)計數(shù)器信號量sem的操作。一次P操作使sem減一,而一次V操作使sem加一。進程(或線程)根據(jù)信號量的值來判斷是否對公共資源具有訪問權限。當信號量sem的值大于等于零時,該進程(或線程)具有公共資源的訪問權限;相反,當信號量sem的值小于零時,該進程(或線程)就將阻塞直到信號量sem的值大于等于0為止。PV原子操作主要用于進程或線程間的同步和互斥這兩種典型情況。Linux實現(xiàn)了POSIX的無名信號量,主要用于線程間的互斥與同步。這里主要介紹幾個常見函數(shù)。s
12、em_init()用于創(chuàng)建一個信號量,并初始化它的值。sem_wait()和sem_trywait()都相當于P操作,在信號量大于零時它們都能將信號量的值減一,兩者的區(qū)別在于若信號量小于零時,sem_wait()將會阻塞進程,而sem_trywait()則會立即返回。sem_post()相當于V操作,它將信號量的值加一同時發(fā)出信號來喚醒等待的進程。sem_getvalue()用于得到信號量的值。sem_destroy()用于刪除信號量。所需頭文件#include 函數(shù)原型int sem_init(sem_t *sem,int pshared,unsigned int value)函數(shù)傳入值se
13、m:信號量指針pshared:決定信號量能否在幾個進程間共享。由于目前Linux還沒有實現(xiàn)進程間共享信號量,所以這個值只能夠取0,就表示這個信號量是當前進程的局部信號量value:信號量初始化值函數(shù)返回值成功:0出錯:1所需頭文件#include 函數(shù)原型int sem_wait(sem_t *sem)int sem_trywait(sem_t *sem)int sem_post(sem_t *sem)int sem_getvalue(sem_t *sem)int sem_destroy(sem_t *sem)函數(shù)傳入值sem:信號量指針函數(shù)返回值成功:0出錯:1實驗目的:學習相關于線程的部分函數(shù),可以在編程中實現(xiàn)對線程的初步操作。為學習進程間的互斥操作打下基礎。實驗要求:編寫程序:1.使用線程解決生產(chǎn)者消費者問題。生產(chǎn)者生產(chǎn)物品用于消費者消費。生產(chǎn)者生產(chǎn)的商品只可以保存2個。生產(chǎn)者生產(chǎn)5次,消費者全部消費。消費者
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 附著升降式腳手架培訓
- 創(chuàng)新創(chuàng)業(yè)校園驛站
- 部門年度培訓總結
- 艾滋病患者護理倫理
- 預防跌倒知識
- 幼兒教師骨干教師
- 廣告行業(yè)設計師簡歷
- 住院患者健康教育的意義
- 轉租商鋪租賃合同
- 腎小球腎炎病理分型
- 副總經(jīng)理招聘面試題與參考回答(某大型央企)2025年
- 2024新能源風電場消防系統(tǒng)檢修規(guī)程
- 智鼎在線測評題
- 2024年中級消防員考試題庫
- 《規(guī)律作息-健康睡眠》主題班會課件
- 人教版九年級化學 5.2 化學方程式(學習、上課課件)
- 研學旅行我做主(課件)20232024學期六年級下冊綜合實踐活動遼師大版
- 2024-2025學年人教版八年級物理上學期課后習題答案
- 氣體滅火系統(tǒng)氣體鋼瓶檢測充裝技術文件
- 《危險化學品企業(yè)安全生產(chǎn)標準化評審標準》
- 成人鼻腸管的留置與維護
評論
0/150
提交評論