linux多線程編程.ppt_第1頁
linux多線程編程.ppt_第2頁
linux多線程編程.ppt_第3頁
linux多線程編程.ppt_第4頁
linux多線程編程.ppt_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、linux多線程編程,Linux下線程概述 linux線程實現(xiàn),1、Linux下線程概述,進程是系統(tǒng)中程序執(zhí)行和資源分配的基本單位。每個進程有自己的數(shù)據(jù)段、代碼段和堆棧段。 線程通常叫做輕型的進程。線程是在共享內(nèi)存空間中并發(fā)執(zhí)行的多道執(zhí)行路徑,他們共享一個進程的資源。 因為線程和進程比起來很小,所以相對來說,線程花費更少的CPU資源。,圖1 進程與線程的關(guān)系,線程按照其調(diào)度者可分為用戶級線程和內(nèi)核級線程兩種。 (1)用戶級線程 主要解決的是上下文切換的問題,其調(diào)度算法和調(diào)度過程全部有用戶決定。 (2)內(nèi)核級線程 有內(nèi)核調(diào)度機制實現(xiàn)。 現(xiàn)在大多數(shù)操作系統(tǒng)都采用用戶級線程和內(nèi)核級線程并存的方法。用

2、戶級線程可與內(nèi)核級線程實現(xiàn)“一對一”,“一對多”的對應(yīng)關(guān)系。,2、linux線程實現(xiàn),以下線程均為用戶級線程。在linux中,一般采用Pthread線程庫實現(xiàn)線程的訪問與控制,由POSIX提出,具有良好的可移植性。,2.1 線程創(chuàng)建與退出,創(chuàng)建線程使用pthread_create函數(shù)。在線程創(chuàng)建以后,就開始運行相關(guān)的線程函數(shù)。線程退出時使用函數(shù)pthread_exit,是線程的主動行為。注意進程退出時使用exit函數(shù),線程中用pthread_exit替代exit。 由于一個進程中的多個線程共享數(shù)據(jù)段,因此通常在線程退出后,退出線程所占用的資源并不會隨線程結(jié)束而釋放。所有需要pthread_jo

3、in函數(shù)來等待線程結(jié)束,類似于wait系統(tǒng)調(diào)用。,創(chuàng)建進程: #include pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg) thread:線程標(biāo)識符 attr:線程屬性設(shè)置 start_routine:線程函數(shù)起始地址 arg:傳遞給start_routine的參數(shù),進程退出: #include pthread_exit( void *retval ) retval: pthread_exit調(diào)用者線程的返回值,可由其他函數(shù)和pthread_

4、join來檢測獲取。,等待進程退出: #include pthread_join( pthread_t *th,void *thread_return ) th:等待線程的標(biāo)識符 thread_return:用戶定義指針,用來存儲被等待線程的返回值 線程實例見:thread.c,2.2 修改線程屬性,在thread_creat函數(shù)中有設(shè)置線程屬性參數(shù),這些屬性包括綁定屬性、分離屬性、堆棧地址、堆棧大小、優(yōu)先級。系統(tǒng)默認屬性為非綁定、非分離、缺省1M的堆棧、與父進程同樣級別的優(yōu)先級。 分別介紹綁定屬性和分離屬性。,1、綁定屬性 在linux系統(tǒng)中,可實現(xiàn)一個用戶級線程與一個內(nèi)核級線程相對應(yīng)的“一

5、對一”線程機制。綁定屬性是指一個用戶級線程固定的分配給一個內(nèi)核級線程。非綁定屬性則是指用戶級線程與內(nèi)核級線程的關(guān)系不是始終固定的,而是由系統(tǒng)來控制分配。,2、分離屬性 分離屬性是用來決定一個線程以什么樣的方式來終止自己。在非分離情況下,當(dāng)一個線程結(jié)束時,它所占用的系統(tǒng)資源并沒有完全釋放,也沒有真正終止。只有當(dāng)pthread_join()函數(shù)返回時,該線程才釋放自己占用的資源。而在分離情況下,一個線程結(jié)束時會立即釋放它所占用的資源。,3、屬性設(shè)置 屬性設(shè)置是由一定函數(shù)來完成的,通常調(diào)用pthread_attr_init函數(shù)進行初始化。設(shè)置綁定屬性的函數(shù)為pthread_attr_setscope

6、,設(shè)置分離屬性的函數(shù)是pthread_attr_setdetachstate,設(shè)置線程優(yōu)先級的相關(guān)函數(shù)pthread_attr_getschdparm(獲取線程優(yōu)先級)和pthread_attr_setschedparam (設(shè)置線程優(yōu)先級)。在設(shè)置完成屬性后,調(diào)用pthread_creat函數(shù)創(chuàng)建線程。,線程屬性初始化: #include int pthread_attr_init (pthread_attr_t *attr) attr:線程屬性 返回值:成功0,錯誤-1。,設(shè)置綁定屬性: #include pthread_attr_setscope(pthread_attr_t *attr

7、, init scope) attr:線程屬性 scope:PTHREAD_SCOPE_SYSTEM(綁定) PTHREAD_SCOPE_PRCESS(非綁定) 返回值:成功0,錯誤-1。,設(shè)置分離屬性: #include pthread_attr_setsetdetachstate(pthread_attr_t*attr, init detachstate) attr:線程屬性 detachstate :PTHREAD_CREAT_DETACHED(分離) PTHREAD_CREAT_JOINABLE(非分離) 返回值:成功0,錯誤-1。,獲取線程優(yōu)先級: #include int pthr

8、ead_attr_getschedparam (pthread_attr_attr *attr, struct sched_param *param) attr:線程屬性 param:線程優(yōu)先級 返回值:成功0,錯誤-1。,設(shè)置線程優(yōu)先級: #include int pthread_attr_setschedparam (pthread_attr_attr *attr, struct sched_param *param) attr:線程屬性 param:線程優(yōu)先級 返回值:成功0,錯誤-1。 線程實例見:pthread.c,2.3 mutex互斥鎖線程控制,mutex是一種簡單的加鎖的方法來

9、控制對共享資源的訪問。在同一時刻只能有一個線程掌握某個互斥上的鎖,擁有上鎖狀態(tài)的線程能夠?qū)蚕碣Y源進行訪問。若其他線程希望上鎖一個已經(jīng)被上了互斥鎖的資源,則該線程掛起,直到上鎖的線程釋放互斥鎖為止。,互斥鎖的操作主要包括以下幾個步驟: 互斥鎖初始化:pthread_mutex_init 互斥鎖上鎖:pthread_mutex_lock 互斥鎖判斷上鎖:pthread_mutex_trylock 互斥鎖解鎖:pthread_mutex_unlock 消除互斥鎖:pthread_mutex_destroy,互斥鎖可分為以下三種: 快速互斥鎖: 遞歸互斥鎖: 檢錯互斥鎖: 這三種鎖的主要區(qū)別在于其他

10、未占有互斥鎖的線程在希望得到互斥鎖時是否需要阻塞等待。 快速互斥鎖是指調(diào)用線程會阻塞直到擁有互斥鎖的線程釋放為止。 遞歸互斥鎖能夠成功返回并且增加調(diào)用線程在互斥上加鎖的次數(shù)。 檢錯互斥鎖則為快速互斥鎖的阻塞版本,他會立即返回并得到一個錯誤。,互斥鎖初始化: #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)建檢錯互斥鎖,互斥鎖操作: #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,錯誤-1。 互斥鎖實例見:mutex.c,2.4 信號量線程控制,信號量也就是操作系統(tǒng)中所用到的PV操作,它廣泛用于進程或線程間的互斥與同步。 PV操作是對整數(shù)計數(shù)器信號量sem的操作。一次P操作使sem減一,一次V操作使sem加一。 用于互斥時,幾個進程(或線程)往往只設(shè)置一個信號量sem。 用于同步時,往往設(shè)置多個信號量,并安排不同的值了來實現(xiàn)它們之間的順序執(zhí)行。,Linux實現(xiàn)了POSIX.1的無名信號量,用于線程的同步與互斥。信號量操作函數(shù): sem_init:用于創(chuàng)建一個信號量,并初始化它。 sem_wait或s

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論