版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、linux多線程編程,Linux下線程概述 linux線程實(shí)現(xiàn),1、Linux下線程概述,進(jìn)程是系統(tǒng)中程序執(zhí)行和資源分配的基本單位。每個(gè)進(jìn)程有自己的數(shù)據(jù)段、代碼段和堆棧段。 線程通常叫做輕型的進(jìn)程。線程是在共享內(nèi)存空間中并發(fā)執(zhí)行的多道執(zhí)行路徑,他們共享一個(gè)進(jìn)程的資源。 因?yàn)榫€程和進(jìn)程比起來很小,所以相對來說,線程花費(fèi)更少的CPU資源。,圖1 進(jìn)程與線程的關(guān)系,線程按照其調(diào)度者可分為用戶級(jí)線程和內(nèi)核級(jí)線程兩種。 (1)用戶級(jí)線程 主要解決的是上下文切換的問題,其調(diào)度算法和調(diào)度過程全部有用戶決定。 (2)內(nèi)核級(jí)線程 有內(nèi)核調(diào)度機(jī)制實(shí)現(xiàn)。 現(xiàn)在大多數(shù)操作系統(tǒng)都采用用戶級(jí)線程和內(nèi)核級(jí)線程并存的方法。用
2、戶級(jí)線程可與內(nèi)核級(jí)線程實(shí)現(xiàn)“一對一”,“一對多”的對應(yīng)關(guān)系。,2、linux線程實(shí)現(xiàn),以下線程均為用戶級(jí)線程。在linux中,一般采用Pthread線程庫實(shí)現(xiàn)線程的訪問與控制,由POSIX提出,具有良好的可移植性。,2.1 線程創(chuàng)建與退出,創(chuàng)建線程使用pthread_create函數(shù)。在線程創(chuàng)建以后,就開始運(yùn)行相關(guān)的線程函數(shù)。線程退出時(shí)使用函數(shù)pthread_exit,是線程的主動(dòng)行為。注意進(jìn)程退出時(shí)使用exit函數(shù),線程中用pthread_exit替代exit。 由于一個(gè)進(jìn)程中的多個(gè)線程共享數(shù)據(jù)段,因此通常在線程退出后,退出線程所占用的資源并不會(huì)隨線程結(jié)束而釋放。所有需要pthread_jo
3、in函數(shù)來等待線程結(jié)束,類似于wait系統(tǒng)調(diào)用。,創(chuàng)建進(jìn)程: #include pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg) thread:線程標(biāo)識(shí)符 attr:線程屬性設(shè)置 start_routine:線程函數(shù)起始地址 arg:傳遞給start_routine的參數(shù),進(jìn)程退出: #include pthread_exit( void *retval ) retval: pthread_exit調(diào)用者線程的返回值,可由其他函數(shù)和pthread_
4、join來檢測獲取。,等待進(jìn)程退出: #include pthread_join( pthread_t *th,void *thread_return ) th:等待線程的標(biāo)識(shí)符 thread_return:用戶定義指針,用來存儲(chǔ)被等待線程的返回值 線程實(shí)例見:thread.c,2.2 修改線程屬性,在thread_creat函數(shù)中有設(shè)置線程屬性參數(shù),這些屬性包括綁定屬性、分離屬性、堆棧地址、堆棧大小、優(yōu)先級(jí)。系統(tǒng)默認(rèn)屬性為非綁定、非分離、缺省1M的堆棧、與父進(jìn)程同樣級(jí)別的優(yōu)先級(jí)。 分別介紹綁定屬性和分離屬性。,1、綁定屬性 在linux系統(tǒng)中,可實(shí)現(xiàn)一個(gè)用戶級(jí)線程與一個(gè)內(nèi)核級(jí)線程相對應(yīng)的“一
5、對一”線程機(jī)制。綁定屬性是指一個(gè)用戶級(jí)線程固定的分配給一個(gè)內(nèi)核級(jí)線程。非綁定屬性則是指用戶級(jí)線程與內(nèi)核級(jí)線程的關(guān)系不是始終固定的,而是由系統(tǒng)來控制分配。,2、分離屬性 分離屬性是用來決定一個(gè)線程以什么樣的方式來終止自己。在非分離情況下,當(dāng)一個(gè)線程結(jié)束時(shí),它所占用的系統(tǒng)資源并沒有完全釋放,也沒有真正終止。只有當(dāng)pthread_join()函數(shù)返回時(shí),該線程才釋放自己占用的資源。而在分離情況下,一個(gè)線程結(jié)束時(shí)會(huì)立即釋放它所占用的資源。,3、屬性設(shè)置 屬性設(shè)置是由一定函數(shù)來完成的,通常調(diào)用pthread_attr_init函數(shù)進(jìn)行初始化。設(shè)置綁定屬性的函數(shù)為pthread_attr_setscope
6、,設(shè)置分離屬性的函數(shù)是pthread_attr_setdetachstate,設(shè)置線程優(yōu)先級(jí)的相關(guān)函數(shù)pthread_attr_getschdparm(獲取線程優(yōu)先級(jí))和pthread_attr_setschedparam (設(shè)置線程優(yōu)先級(jí))。在設(shè)置完成屬性后,調(diào)用pthread_creat函數(shù)創(chuàng)建線程。,線程屬性初始化: #include int pthread_attr_init (pthread_attr_t *attr) attr:線程屬性 返回值:成功0,錯(cuò)誤-1。,設(shè)置綁定屬性: #include pthread_attr_setscope(pthread_attr_t *attr
7、, init scope) attr:線程屬性 scope:PTHREAD_SCOPE_SYSTEM(綁定) PTHREAD_SCOPE_PRCESS(非綁定) 返回值:成功0,錯(cuò)誤-1。,設(shè)置分離屬性: #include pthread_attr_setsetdetachstate(pthread_attr_t*attr, init detachstate) attr:線程屬性 detachstate :PTHREAD_CREAT_DETACHED(分離) PTHREAD_CREAT_JOINABLE(非分離) 返回值:成功0,錯(cuò)誤-1。,獲取線程優(yōu)先級(jí): #include int pthr
8、ead_attr_getschedparam (pthread_attr_attr *attr, struct sched_param *param) attr:線程屬性 param:線程優(yōu)先級(jí) 返回值:成功0,錯(cuò)誤-1。,設(shè)置線程優(yōu)先級(jí): #include int pthread_attr_setschedparam (pthread_attr_attr *attr, struct sched_param *param) attr:線程屬性 param:線程優(yōu)先級(jí) 返回值:成功0,錯(cuò)誤-1。 線程實(shí)例見:pthread.c,2.3 mutex互斥鎖線程控制,mutex是一種簡單的加鎖的方法來
9、控制對共享資源的訪問。在同一時(shí)刻只能有一個(gè)線程掌握某個(gè)互斥上的鎖,擁有上鎖狀態(tài)的線程能夠?qū)蚕碣Y源進(jìn)行訪問。若其他線程希望上鎖一個(gè)已經(jīng)被上了互斥鎖的資源,則該線程掛起,直到上鎖的線程釋放互斥鎖為止。,互斥鎖的操作主要包括以下幾個(gè)步驟: 互斥鎖初始化:pthread_mutex_init 互斥鎖上鎖:pthread_mutex_lock 互斥鎖判斷上鎖:pthread_mutex_trylock 互斥鎖解鎖:pthread_mutex_unlock 消除互斥鎖:pthread_mutex_destroy,互斥鎖可分為以下三種: 快速互斥鎖: 遞歸互斥鎖: 檢錯(cuò)互斥鎖: 這三種鎖的主要區(qū)別在于其他
10、未占有互斥鎖的線程在希望得到互斥鎖時(shí)是否需要阻塞等待。 快速互斥鎖是指調(diào)用線程會(huì)阻塞直到擁有互斥鎖的線程釋放為止。 遞歸互斥鎖能夠成功返回并且增加調(diào)用線程在互斥上加鎖的次數(shù)。 檢錯(cuò)互斥鎖則為快速互斥鎖的阻塞版本,他會(huì)立即返回并得到一個(gè)錯(cuò)誤。,互斥鎖初始化: #include int pthread_mutex_init( pthread_mutex_t *mutex, constpthread_mutex_attr_t *mutexattr) Mutex:互斥鎖 Mutexattr:PTHREAD_MUTEX_INITIALIZER: 創(chuàng)建快速互斥鎖 PTHREAD_RECURSIVE_MUT
11、EX_INITIALIZER_NP: 創(chuàng)建遞歸互斥鎖 PTHREAD_REEORCHECK_MUTEX_INITIALIZER_NP: 創(chuàng)建檢錯(cuò)互斥鎖,互斥鎖操作: #include 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) Mutex:互斥鎖 返回值:成功0,錯(cuò)誤-1。 互斥鎖實(shí)例見:mutex.c,2.4 信號(hào)量線程控制,信號(hào)量也就是操作系統(tǒng)中所用到的PV操作,它廣泛用于進(jìn)程或線程間的互斥與同步。 PV操作是對整數(shù)計(jì)數(shù)器信號(hào)量sem的操作。一次P操作使sem減一,一次V操作使sem加一。 用于互斥時(shí),幾個(gè)進(jìn)程(或線程)往往只設(shè)置一個(gè)信號(hào)量sem。 用于同步時(shí),往往設(shè)置多個(gè)信號(hào)量,并安排不同的值了來實(shí)現(xiàn)它們之間的順序執(zhí)行。,Linux實(shí)現(xiàn)了POSIX.1的無名信號(hào)量,用于線程的同步與互斥。信號(hào)量操作函數(shù): sem_init:用于創(chuàng)建一個(gè)信號(hào)量,并初始化它。 sem_wait或s
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新生兒科三基理論考試試題及答案
- 臨床醫(yī)學(xué)概論模擬習(xí)題(附參考答案)
- 道路交通安全教育試題(附答案)
- 福建省漳州市教師職稱考試(理論知識(shí))在線模擬題庫及答案
- 銀行信貸考試題庫及答案
- 水利水電工程師考2025測試真題及答案
- 商法一期末考試題及答案
- 車險(xiǎn)理賠考試1000題(含答案)第四季
- 食品營養(yǎng)學(xué)題庫及答案
- 急危重癥護(hù)理學(xué)練習(xí)題(答案)
- 柴油維修技術(shù)培訓(xùn)課件
- DL∕T 5210.6-2019 電力建設(shè)施工質(zhì)量驗(yàn)收規(guī)程 第6部分:調(diào)整試驗(yàn)
- 2024年度初會(huì)《初級(jí)會(huì)計(jì)實(shí)務(wù)》高頻真題匯編(含答案)
- 績效考核和薪酬方案通用模板
- YY/T 0590.1-2018醫(yī)用電氣設(shè)備數(shù)字X射線成像裝置特性第1-1部分:量子探測效率的測定普通攝影用探測器
- GB/T 16927.1-2011高電壓試驗(yàn)技術(shù)第1部分:一般定義及試驗(yàn)要求
- 政府會(huì)計(jì)準(zhǔn)則優(yōu)秀課件
- 陣發(fā)性室性心動(dòng)過速課件
- 無機(jī)與分析化學(xué)理論教案
- 名詞性從句 講義-英語高考一輪復(fù)習(xí)語法部分
- T∕ZZB 2722-2022 鏈板式自動(dòng)排屑裝置
評論
0/150
提交評論