linux多線程編程 (2)_第1頁(yè)
linux多線程編程 (2)_第2頁(yè)
linux多線程編程 (2)_第3頁(yè)
linux多線程編程 (2)_第4頁(yè)
linux多線程編程 (2)_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

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)程比起來(lái)很小,所以相對(duì)來(lái)說(shuō),線程花費(fèi)更少的CPU資源。用戶地址空間線程一線程二線程三進(jìn) 程圖1 進(jìn)程與線程的關(guān)系線程按照其調(diào)度者可分為用戶級(jí)線程和內(nèi)核級(jí)線程兩種。(1)用戶級(jí)線程主要解決的是上下文切換的問(wèn)題,其調(diào)度算法和調(diào)度過(guò)程全部有用戶決定。(2)內(nèi)核級(jí)線程有內(nèi)核調(diào)度機(jī)制實(shí)現(xiàn)?,F(xiàn)在大多數(shù)操作系統(tǒng)都采用用戶級(jí)線程和內(nèi)核級(jí)線程并存

2、的方法。用戶級(jí)線程可與內(nèi)核級(jí)線程實(shí)現(xiàn)“一對(duì)一”,“一對(duì)多”的對(duì)應(yīng)關(guān)系。2、linux線程實(shí)現(xiàn)以下線程均為用戶級(jí)線程。在linux中,一般采用Pthread線程庫(kù)實(shí)現(xiàn)線程的訪問(wèn)與控制,由POSIX提出,具有良好的可移植性。2.1 線程創(chuàng)建與退出創(chuàng)建線程使用pthread_create函數(shù)。在線程創(chuàng)建以后,就開(kāi)始運(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ù)來(lái)等待線程結(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_join來(lái)檢測(cè)獲取。等

4、待進(jìn)程退出:#include pthread_join( pthread_t *th,void *thread_return )th:等待線程的標(biāo)識(shí)符thread_return:用戶定義指針,用來(lái)存儲(chǔ)被等待線程的返回值線程實(shí)例見(jiàn):thread.c2.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í)線程相對(duì)應(yīng)的“一對(duì)一”線程機(jī)制。綁定屬性是指一個(gè)用戶級(jí)線

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

6、_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, init scope)attr:線程屬性scope:

7、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 pthread_attr_getschedparam (pthread_attr_a

8、ttr *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í)例見(jiàn):pthread.c2.3 mutex互斥鎖線程控制 mutex是一種簡(jiǎn)單的加鎖的方法來(lái)控制對(duì)共享資源的訪問(wèn)。在同一時(shí)刻只能有一個(gè)線程掌握某個(gè)互斥上的鎖,擁有上鎖狀態(tài)的線程能夠?qū)蚕碣Y源進(jìn)

9、行訪問(wèn)。若其他線程希望上鎖一個(gè)已經(jīng)被上了互斥鎖的資源,則該線程掛起,直到上鎖的線程釋放互斥鎖為止?;コ怄i的操作主要包括以下幾個(gè)步驟: 互斥鎖初始化:pthread_mutex_init 互斥鎖上鎖:pthread_mutex_lock 互斥鎖判斷上鎖:pthread_mutex_trylock 互斥鎖解鎖:pthread_mutex_unlock 消除互斥鎖:pthread_mutex_destroy互斥鎖可分為以下三種: 快速互斥鎖: 遞歸互斥鎖: 檢錯(cuò)互斥鎖: 這三種鎖的主要區(qū)別在于其他未占有互斥鎖的線程在希望得到互斥鎖時(shí)是否需要阻塞等待。 快速互斥鎖是指調(diào)用線程會(huì)阻塞直到擁有互斥鎖的線程

10、釋放為止。 遞歸互斥鎖能夠成功返回并且增加調(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_MUTEX_INITIALIZER_NP:創(chuàng)建遞歸互斥鎖 PTHREAD_REEORCHECK_MUTEX_INITIAL

11、IZER_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í)例見(jiàn):mutex.c2.4 信號(hào)量線程控制信號(hào)量也就是操作系統(tǒng)中所用到的PV操作,它廣泛用于進(jìn)程或線程間的互斥與同步。PV操作是對(duì)整數(shù)計(jì)數(shù)器信號(hào)量sem的操作。一次P操作使sem減一,一次V操作使sem加一。用于互斥時(shí),幾個(gè)進(jìn)程(或線程)往往只設(shè)置一個(gè)信號(hào)量sem。用于同步時(shí),往往設(shè)置多個(gè)信號(hào)量,并安排不同的值了來(lái)實(shí)現(xiàn)它們之間的順序執(zhí)行。開(kāi)始初始化信號(hào)量V操作V操作線程二執(zhí)行線程一執(zhí)行P操作P操作結(jié)束圖2 信號(hào)量互斥操作Linux實(shí)現(xiàn)了POSIX.1的無(wú)名信號(hào)量,用于線程的同步與互斥。信號(hào)量操作函數(shù):sem_init:用于創(chuàng)建一個(gè)信號(hào)量,并初始化它。sem_wa

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論