版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第9章嵌入式Linux多線程開發(fā)本章教學(xué)目的及要求 了解Linux的多線程概念 掌握Linux多線程相關(guān)的API 理解Linux多線程的通信機(jī)制及常用方法線程的概念進(jìn)程是系統(tǒng)中程序執(zhí)行和資源分配的基本單位。每個(gè)進(jìn)程都擁有自己的數(shù)據(jù)段、代碼段和堆棧段,這就造成了進(jìn)程在進(jìn)行切換等操作時(shí)都需要有比較費(fèi)時(shí)的上下文切換等動(dòng)作。為了進(jìn)一步減少處理機(jī)的空轉(zhuǎn)時(shí)間支持多處理器和減少上下文切換開銷,進(jìn)程在演化中出現(xiàn)了另一個(gè)概念——線程線程的概念進(jìn)程是系統(tǒng)中程序執(zhí)行和資源分配的基本單位。每個(gè)進(jìn)程都擁有自己的數(shù)據(jù)段、代碼段和堆棧段,這就造成了進(jìn)程在進(jìn)行切換等操作時(shí)都需要有比較費(fèi)時(shí)的上下文切換等動(dòng)作。為了進(jìn)一步減少處理機(jī)的空轉(zhuǎn)時(shí)間支持多處理器和減少上下文切換開銷,進(jìn)程在演化中出現(xiàn)了另一個(gè)概念——線程線程的概念進(jìn)程是系統(tǒng)中程序執(zhí)行和資源分配的基本單位。每個(gè)進(jìn)程都擁有自己的數(shù)據(jù)段、代碼段和堆棧段,這就造成了進(jìn)程在進(jìn)行切換等操作時(shí)都需要有比較費(fèi)時(shí)的上下文切換等動(dòng)作。為了進(jìn)一步減少處理機(jī)的空轉(zhuǎn)時(shí)間支持多處理器和減少上下文切換開銷,進(jìn)程在演化中出現(xiàn)了另一個(gè)概念——線程線程是一個(gè)進(jìn)程內(nèi)的基本調(diào)度單位,也可以稱為輕量級進(jìn)程。線程是在共享內(nèi)存空間中并發(fā)的多道執(zhí)行路徑,它們共享一個(gè)進(jìn)程的資源,如文件描述和信號處理。因此,大大減少了上下文切換的開銷。線程的概念進(jìn)程是系統(tǒng)中程序執(zhí)行和資源分配的基本單位。每個(gè)進(jìn)程都擁有自己的數(shù)據(jù)段、代碼段和堆棧段,這就造成了進(jìn)程在進(jìn)行切換等操作時(shí)都需要有比較費(fèi)時(shí)的上下文切換等動(dòng)作。為了進(jìn)一步減少處理機(jī)的空轉(zhuǎn)時(shí)間支持多處理器和減少上下文切換開銷,進(jìn)程在演化中出現(xiàn)了另一個(gè)概念——線程線程是一個(gè)進(jìn)程內(nèi)的基本調(diào)度單位,也可以稱為輕量級進(jìn)程。線程是在共享內(nèi)存空間中并發(fā)的多道執(zhí)行路徑,它們共享一個(gè)進(jìn)程的資源,如文件描述和信號處理。因此,大大減少了上下文切換的開銷。同進(jìn)程一樣,線程也將相關(guān)的變量值放在線程控制表內(nèi)。一個(gè)進(jìn)程可以有多個(gè)線程,也就是有多個(gè)線程控制表及堆棧寄存器,但卻共享一個(gè)用戶地址空間。要注意的是,由于線程共享了進(jìn)程的資源和地址空間,因此,任何線程對系統(tǒng)資源的操作都會給其他線程帶來影響,因此,多線程中的同步就是非常重要的問題了
9.1
Linux多線程相關(guān)API
Linux有多線程開發(fā)的Pthread
庫支持。涉及多線程開發(fā)的最基本概念:線程、互斥鎖、條件。①線程操作又分線程的創(chuàng)建、退出、等待。②互斥鎖則包括4種操作:創(chuàng)建、銷毀、加鎖和解鎖。③條件操作有5種操作:創(chuàng)建、銷毀、觸發(fā)、廣播和等待。其他的一些線程擴(kuò)展概念,如信號燈等,都可以通過上面的三個(gè)基本元素的基本操作封裝出來。9.1
Linux多線程相關(guān)API線程使用線程主要包括以下幾個(gè)步驟:創(chuàng)建線程調(diào)用相關(guān)線程函數(shù)線程退出線程資源回收9.1.1線程的創(chuàng)建Pthread不是linux系統(tǒng)默認(rèn)的庫,連接時(shí)需要使用庫libthread.a執(zhí)行順序9.
1.
2
線程終止此函數(shù)用來等待一個(gè)線程的結(jié)束。這個(gè)函數(shù)是一個(gè)線程阻塞的函數(shù),調(diào)用它的函數(shù)將一直等待到被等待的線程結(jié)束為止,當(dāng)函數(shù)返回時(shí),被等待線程的資源被收回。9.1.2線程終止線程結(jié)束的兩種途徑:當(dāng)函數(shù)結(jié)束了,調(diào)用它的線程也就結(jié)束了;另一種方式是通過函數(shù)pthread_exit
來實(shí)現(xiàn)。閱讀程序?qū)懗鼋Y(jié)果9.1.3線程的標(biāo)識每個(gè)進(jìn)程有一個(gè)進(jìn)程ID,每個(gè)線程也有一個(gè)線程ID,進(jìn)程ID在整個(gè)系統(tǒng)中是唯一的,但線程不同,線程ID只在它所屬的進(jìn)程環(huán)境中有效。線程ID用pthread_t數(shù)據(jù)類型來表示,實(shí)現(xiàn)的時(shí)候可以用一個(gè)結(jié)構(gòu)來代表pthread_t數(shù)據(jù)類型,所以可以移植的操作系統(tǒng)不能把它作為整數(shù)處理。1.pthread_self()函數(shù)函數(shù)用于獲取自身線程的id。其函數(shù)原型為:#include<pthread.h>pthread_t
pthread_self(void);返回值:調(diào)用線程的線程id。2.pthread_equal函數(shù)pthread_equal函數(shù)用于測試兩個(gè)線程號ID是否相同。其函數(shù)原型為:#include<pthread.h>int
pthread_equal(pthread_ttid1,pthread_ttid2);返回值:測試兩個(gè)線程號ID是否相同。若相等返回非0值,否則返回0。函數(shù)說明:函數(shù)中的參數(shù)tid1為線程1的ID,tid2為線程2的ID。
9.1
Linux多線程相關(guān)API
Linux有多線程開發(fā)的Pthread
庫支持。涉及多線程開發(fā)的最基本概念:線程、互斥鎖、條件。①線程操作又分線程的創(chuàng)建、退出、等待。②互斥鎖則包括4種操作:創(chuàng)建、銷毀、加鎖和解鎖。③條件操作有5種操作:創(chuàng)建、銷毀、觸發(fā)、廣播和等待。其他的一些線程擴(kuò)展概念,如信號燈等,都可以通過上面的三個(gè)基本元素的基本操作封裝出來。9.2線程訪問控制解決的問題:由于線程共享進(jìn)程的資源和地址空間,因此在對這些資源進(jìn)行操作時(shí),必須考慮到線程資源訪問的惟一性問題。主要介紹POSIX(可移植性操作系統(tǒng)接口)中線程同步的方法,主要有互斥鎖和信號量的方式。1.mutex互斥量線程控制2.信號量線程控制(1)說明mutex
是通過加鎖來控制對共享資源的存取的一種簡單方法。這個(gè)互斥量只有兩種狀態(tài),也就是上鎖和解鎖,可以把互斥鎖看作某種意義上的全局變量。1.mutex
互斥量線程控制(1)說明mutex
是通過加鎖來控制對共享資源的存取的一種簡單方法。這個(gè)互斥量只有兩種狀態(tài),也就是上鎖和解鎖,可以把互斥鎖看作某種意義上的全局變量。在同一時(shí)刻只能有一個(gè)線程掌握某個(gè)互斥量上的鎖,擁有上鎖狀態(tài)的線程能夠?qū)蚕碣Y源進(jìn)行操作。若其他線程希望上鎖一個(gè)已經(jīng)上鎖了的互斥量,則該線程就會掛起,直到上鎖的線程釋放掉互斥量上的鎖為止??梢哉f,這把互斥鎖使得各個(gè)線程按序操作共享資源。1.mutex
互斥量線程控制(1)說明mutex
是通過加鎖來控制對共享資源的存取的一種簡單方法。這個(gè)互斥量只有兩種狀態(tài),也就是上鎖和解鎖,可以把互斥鎖看作某種意義上的全局變量。在同一時(shí)刻只能有一個(gè)線程掌握某個(gè)互斥量上的鎖,擁有上鎖狀態(tài)的線程能夠?qū)蚕碣Y源進(jìn)行操作。若其他線程希望上鎖一個(gè)已經(jīng)上鎖了的互斥量,則該線程就會掛起,直到上鎖的線程釋放掉互斥量上的鎖為止??梢哉f,這把互斥鎖使得各個(gè)線程按序操作共享資源。1.mutex
互斥量線程控制互斥鎖的操作主要包括以下幾個(gè)步驟互斥鎖初始化:
pthread_mutex_init互斥鎖上鎖:
pthread_mutex_lock互斥鎖判斷上鎖:
pthread_mutex_trylock互斥鎖解鎖:
pthread_mutex_unlock消除互斥鎖:
pthread_mutex_destroy互斥鎖分類及區(qū)別互斥鎖可以分為快速互斥鎖、遞歸互斥鎖和檢錯(cuò)互斥鎖。這三種鎖的區(qū)別主要在于其他未占有互斥鎖的線程在希望得到互斥鎖時(shí),是否需要阻塞等待快速鎖是指調(diào)用線程會阻塞直至擁有互斥鎖的線程解鎖為止。遞歸互斥鎖能夠成功地返回并且增加調(diào)用線程在互斥上加鎖的次數(shù)。而檢錯(cuò)互斥鎖則為快速互斥鎖的非阻塞版本,它會立即返回并返回一個(gè)錯(cuò)誤信息。(2)函數(shù)格式互斥鎖用pthread_mutex_t數(shù)據(jù)類型來表示,在使用互斥鎖之前,必須首先對它進(jìn)行初始化,通過調(diào)用pthread_mutex_init函數(shù)可以進(jìn)行初始化靜態(tài)和動(dòng)態(tài)分配的互斥鎖pthread_mutex_init函數(shù)用于初始化互斥鎖。使用默認(rèn)值初始化時(shí)為NULL對共享資源的訪問,要對互斥量進(jìn)行加鎖,如果互斥量已經(jīng)上了鎖,調(diào)用線程會阻塞,直到互斥量被解鎖。在完成了對共享資源的訪問后,要對互斥量進(jìn)行解鎖。int
pthread_mutex_trylock(pthread_mutex_t*mutex);函數(shù)參數(shù):參數(shù)mutex是互斥量返回值:成功則返回0,出錯(cuò)則返回錯(cuò)誤編號函數(shù)說明:trylock函數(shù),這個(gè)函數(shù)是非阻塞調(diào)用模式,也就是說,如果互斥量沒被鎖住,trylock函數(shù)將把互斥量加鎖,并獲得對共享資源的訪問權(quán)限;如果互斥量被鎖住了,trylock函數(shù)將不會阻塞等待而直接返回EBUSY,表示共享資源處于忙狀態(tài)。互斥量解鎖函數(shù)#include<pthread.h>int
pthread_mutex_unlock(pthread_mutex_t*mutex);函數(shù)參數(shù):參數(shù)mutex是互斥量返回值:成功則返回0,出錯(cuò)則返回錯(cuò)誤編號對互斥量解鎖,需要調(diào)用pthread_mutex_unlock.(3)使用實(shí)例main線程與thread_function交替運(yùn)行,都可以對run_now進(jìn)行操作。代表共享資源訪問run_now的function線程函數(shù)創(chuàng)建一個(gè)線程主線程執(zhí)行的操作主線程執(zhí)行的操作等待子線程結(jié)束以釋放資源main線程和function線程交替運(yùn)行,兩者都可以實(shí)現(xiàn)對run_now的操作。如何實(shí)現(xiàn)對它的鎖定?為互斥量加鎖代表共享資源訪問run_now的function線程函數(shù)定義互斥量main都干了什么?初始化互斥量創(chuàng)建新線程對互斥量上鎖,上鎖成功顯示mainlockmain都干了什么?執(zhí)行循環(huán)操作給互斥變量解鎖,顯示解鎖成功收回互斥變量資源等待線程結(jié)束,釋放資源“main都干了什么?”的簡化版初始化互斥量創(chuàng)建新線程對互斥量上鎖,上鎖成功顯示mainlock執(zhí)行循環(huán)操作給互斥變量解鎖,顯示解鎖成功收回互斥變量資源等待線程結(jié)束,釋放資源簡化后的main運(yùn)行結(jié)果練習(xí)2.信號量線程控制(1)信號量說明信號量也就是操作系統(tǒng)中所用到的PV原語,它廣泛用于進(jìn)程或線程間的同步與互斥。信號量本質(zhì)上是一個(gè)非負(fù)的整數(shù)計(jì)數(shù)器,它被用來控制對公共資源的訪問。PV原語PV原語是對整數(shù)計(jì)數(shù)器信號量sem的操作。一次P操作使sem減一,而一次V操作sem加一。進(jìn)程(或線程)根據(jù)信號量的值來判斷是否對公共資源具有訪問權(quán)限。當(dāng)信號量sem
的值大于等于零時(shí),該進(jìn)程(或線程)具有公共資源的訪問權(quán)限;相反,當(dāng)信號量sem的值小于零時(shí),該進(jìn)程(或線程)就將阻塞直到信號量sem的值大于等于0為止。PV原語主要用于進(jìn)程或線程間的同步和互斥這兩種典型情況。若用于互斥,幾個(gè)進(jìn)程(或線程)往往只設(shè)置一個(gè)信號量sem,它們的操作流程如圖。當(dāng)信號量用于同步操作時(shí),往往會設(shè)置多個(gè)信號量,并安排不同的初始值來實(shí)現(xiàn)它們之間的順序執(zhí)行,它們的操作流程如圖。(2)函數(shù)說明Linux實(shí)現(xiàn)了POSIX的無名信號量(基于內(nèi)存的信號量),主要用于線程間的互斥、同步。這里主要介紹幾個(gè)常見函數(shù)。sem_init用于創(chuàng)建一個(gè)信號量,并能初始化它的值。sem_wait和sem_trywait函數(shù)用于等待共享資源,相當(dāng)于P操作,它們都能將信號量的值減一,兩者的區(qū)別在于若信號量小于零時(shí),sem_wait將會阻塞進(jìn)程,而sem_trywait則會立即返回。sem_post相當(dāng)于V操作,它將信號量的值加一同時(shí)發(fā)出信號喚醒等待的進(jìn)程。sem_getvalue用于得到信號量的值。sem_destroy用于刪除信號量。(3)函數(shù)格式(3)函數(shù)格式(4)使用實(shí)例使用信號量實(shí)現(xiàn)對lock_var
的操作,在這里使用的是互斥操作,也就是只使用一個(gè)信號量來實(shí)現(xiàn)條件變量條件變量是利用線程間共享的全局變量進(jìn)行同步的一種機(jī)制。主要包括兩個(gè)動(dòng)作:一個(gè)線程等待“條件變量的條件成立”而掛起;另一個(gè)線程使“條件成立”(給出條件成立信號)。為了防止競爭,條件變量的使用總是和一個(gè)互斥鎖結(jié)合在一起。條件變量的創(chuàng)建與注銷條件變量和互斥鎖一樣,都有靜態(tài)動(dòng)態(tài)兩種創(chuàng)建方式。靜態(tài)方式使用PTHREAD_COND_INITIALIZER常量
pthread_cond_t
cond=PTHREAD_COND_INITIALIZER動(dòng)態(tài)方式調(diào)用pthread_cond_init()函數(shù),API定義:
int
pthread_cond_init(pthread_cond_t*cond,pthread_condattr_t*cond_attr)盡管POSIX標(biāo)準(zhǔn)中為條件變量定義了屬性,但在LinuxThreads中沒有實(shí)現(xiàn),因此cond_attr值通常為NULL,且被忽略。條件變量的創(chuàng)建與注銷注銷一個(gè)條件變量需要調(diào)用pthread_cond_destroy()只有在沒有線程在該條件變量上等待的時(shí)候才能注銷這個(gè)條件變量,否則返回EBUSY。因?yàn)長inux實(shí)現(xiàn)的條件變量沒有分配什么資源,所以注銷動(dòng)作只包括檢查是否有等待線程。API定義如下:
int
pthread_cond_destroy(pthread_cond_t*cond)條件變量的等待與觸發(fā)等待條件有兩種方式:無條件等待pthread_cond_wait()計(jì)時(shí)等待pthread_cond_timedwait(),其中計(jì)時(shí)等待方式如果在給定時(shí)刻前條件沒有滿足,則返回ETIMEOUT,結(jié)束等待。無論哪種等待方式,都必須和一個(gè)互斥鎖配合,以防止多個(gè)線程同時(shí)請求等待條件的競爭條件(RaceCondition)。mutex互斥鎖在調(diào)用pthread_cond_wait()前必須由本線程加鎖,而在更新條件等待隊(duì)列以前,mutex保持鎖定狀態(tài),并在線程掛起進(jìn)入等待前解鎖。注:想要實(shí)現(xiàn)線程間的同步,需要使用互斥鎖和條件變量相互配合?;コ饬俊⑿盘柫?、條件變量Mutex互斥量,用于操作某個(gè)臨界資源時(shí)對該資源上鎖,以實(shí)現(xiàn)互斥地對獨(dú)占資源的使用。Semophore信號量,信號量內(nèi)有一計(jì)數(shù)器,可以用于對多個(gè)同類資源的分配。當(dāng)資源用完時(shí),申請資源的線程會在信號量上睡眠,有線程釋放資源時(shí),再將該線程喚醒繼續(xù)運(yùn)行。Condit
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年鐵路貨物運(yùn)輸與專用線運(yùn)營合同
- 2025年度建筑勞務(wù)分包合同標(biāo)的工程進(jìn)度與質(zhì)量監(jiān)管條款3篇
- 2024年贈(zèng)與股份合同:父子權(quán)益的傳遞與確認(rèn)
- 2024庭院園藝景觀設(shè)計(jì)與生態(tài)修復(fù)工程包工合同范本6篇
- 2024年電子商務(wù)平臺送貨員聘用合同
- 2024年航空航天產(chǎn)業(yè)投資合作意向書(國家戰(zhàn)略版)3篇
- 2024年社交媒體品牌建設(shè)與維護(hù)服務(wù)條款3篇
- 2024年版權(quán)許可合同違約責(zé)任認(rèn)定
- 2024年資產(chǎn)重組合同范本
- 2024物業(yè)管理實(shí)務(wù)客戶關(guān)系管理與滿意度調(diào)查合同3篇
- 中國馬克思主義與當(dāng)代思考題(附答案)
- ESD靜電防護(hù)檢測及管控標(biāo)準(zhǔn)
- 【求陰影部分面積】五年級上冊數(shù)學(xué)必考求陰影部分面積35題2023.9.27
- 結(jié)核病診斷-TSPOT-實(shí)驗(yàn)課件
- 業(yè)主搭建陽光房申請書
- 小學(xué)語文分層作業(yè)設(shè)計(jì)案例
- 四川旭虹光電科技有限公司曲面顯示用蓋板玻璃生產(chǎn)項(xiàng)目環(huán)評報(bào)告
- 傷口愈合的病理生理及濕性愈合理論-課件
- GB/T 24475-2023電梯遠(yuǎn)程報(bào)警系統(tǒng)
- 科技計(jì)劃項(xiàng)目(課題)驗(yàn)收(結(jié)題)經(jīng)費(fèi)審計(jì)業(yè)務(wù)約定書
- SIS系統(tǒng)操作規(guī)程
評論
0/150
提交評論