POSIX线程的同步
?當(dāng)線程運(yùn)行在同樣的線程空間,線程們共享同樣的內(nèi)存和資源。這使它變得很容易對(duì)于線程來(lái)通信和共享數(shù)據(jù),盡管它會(huì)發(fā)生兩種問(wèn)題:線程阻塞和內(nèi)存不一致由于線程的同步對(duì)共享資源的修改。在這些情況下,線程同步變得很重要。線程同步提供了這機(jī)制來(lái)確保同步運(yùn)行的線程并不執(zhí)行同一塊代碼在同一時(shí)間。與Java線程類似,這POSIX Thread API也提供同步的函數(shù)。這章主要講述兩種有POSIX Threads提供的同步機(jī)制:?
??????? Mutexes(互斥信號(hào)量)被包含在同一代碼中并不能在同一時(shí)間執(zhí)行。
?????? Semaphores(資源信號(hào)量)通過(guò)指定的資源數(shù)量來(lái)控制獲得資源。如果沒(méi)有資源,這調(diào)用線程等待資源被釋放后執(zhí)行。
????? 使用互斥信號(hào)量的同步線程:
???? POSIX Thread API通過(guò)pthread_mutex_t數(shù)據(jù)類型來(lái)展示互斥信號(hào)量給原生代碼。這
POSIX Thread API提供了一套函數(shù)來(lái)和互斥信號(hào)量通信。使用之前,這互斥信號(hào)量應(yīng)該被先初始化。
?? 初始化信號(hào)量:
?? 這POSIX Thread API提供兩種方式初始化信號(hào)量:pthead_mutex_init函數(shù)和PTHREAD_MUTEX_INITIALIZER宏。這pthread_mutex_init函數(shù)能夠被用來(lái)初始化這個(gè)信號(hào)量。
??? int pthread_mutex_init(pthread_mutex_t* mutex,const pthread_mutexattr_t* attr);
? 這個(gè)pthread_mutex_init函數(shù)的兩個(gè)參數(shù),一個(gè)互斥信號(hào)量的指針來(lái)初始化和一個(gè)phread_mutexattr_t結(jié)構(gòu)定義這互斥信號(hào)量的指針。如果第二個(gè)參數(shù)被設(shè)置為NULL,這默認(rèn)的屬性被使用。如果這默認(rèn)屬性時(shí)足夠,代替者pthread_mutex_init函數(shù),這PTHREAD_MUTEX_INITIALIZER宏是最恰當(dāng)?shù)摹?/span>
?? pthread_mutex_t mutex=PTHREAD_MUTEX_INITALIZER;
基于成功的初始化,這互斥信號(hào)量的狀態(tài)變得被初始和unlocked,和這函數(shù)返回0,否則它將返回這錯(cuò)誤代碼。
?? 鎖定互斥信號(hào)量
? 這pthread_mutex_lock函數(shù)被用來(lái)獲得共同的代碼通過(guò)鎖定已經(jīng)初始化的信號(hào)量。
?? int pthread_mutex_lock(pthread_mutex_t* mutex);
這個(gè)函數(shù)的參數(shù)是這互斥信號(hào)量的指針。如果這互斥信號(hào)量已經(jīng)被鎖定了,這調(diào)用先被阻止直到互斥信號(hào)量被解鎖。成功的情況下,返回0;否則它返回這錯(cuò)誤代碼。
?? 解鎖信號(hào)量
? 基于完成執(zhí)行這嚴(yán)格的代碼區(qū)間,這互斥信號(hào)能夠解鎖使用pthread_mutex_unlock函數(shù)。
??? int pthread_mutex_unlock(pthread_mutex_t* mutex);
?成功執(zhí)行時(shí)返回0;否則返回錯(cuò)誤代碼。
? pthread_mutex_destroy銷毀互斥信號(hào)量。
使用資源信號(hào)量同步POSIX Threads:
??? 并不像其他的POSIX函數(shù),這個(gè)POSIX資源信號(hào)量被定義在一個(gè)不同的頭文件,這semaphore.h中。
?? #include<semaphore.h>
? 這POSXI資源信號(hào)量通過(guò)sem_t 數(shù)據(jù)類型被展示給原生代碼。這POSIX 資源信號(hào)量API提供了一套函數(shù)對(duì)于來(lái)自原生代碼的資源信號(hào)量相互制約。使用之前,這資源信號(hào)量必須先被初始化。
??? 初始化資源信號(hào)量:
?? 這POSIX資源信號(hào)量API同sem_init函數(shù)來(lái)初始化這資源信號(hào)量。
?? extern int sem_init(sem_t* sem,int pshared,unsigned int value);
? 他的三個(gè)參數(shù):一個(gè)資源信號(hào)量的指針被初始化,這共享的標(biāo)記和它初始化的值。一旦成功返回0,否則返回-1;
??? 鎖定資源信號(hào)量
?? 一旦這資源信號(hào)量被恰當(dāng)初始化,線程能夠?qū)嵱胹em_wait函數(shù)來(lái)減少這信號(hào)量的數(shù)量:
??? extern int sem_wait(sem_t* sem);
?? 這函數(shù)信號(hào)量的指針為參數(shù)。如果資源信號(hào)量的值是大于0的,這鎖定成功和這信號(hào)量的值就會(huì)減少。如果這信號(hào)量的值為0,調(diào)用線程就會(huì)阻止直到這資源信號(hào)里通過(guò)unlocking來(lái)增加。一旦成功,這函數(shù)返回0;否則返回-1;
??? 解鎖資源信號(hào)量
?? 一旦完成這執(zhí)行關(guān)鍵代碼區(qū),這線程能偶解鎖資源信號(hào)量通過(guò)這sem_post函數(shù)。
?? extern int sem_post(sem_t* sem);
? 當(dāng)這資源信號(hào)量被解鎖通過(guò)sem_post函數(shù),它的值增加1.調(diào)度策略決定那個(gè)線程得到執(zhí)行。一旦成功返回0,否則返回-1;
?? 銷毀資源信號(hào)量:
?? 一旦這資源信號(hào)量不在被需要,它可以被銷毀通過(guò)這sem_destroy函數(shù)。
?? extern int sem_destroy(sem_t* sem);
? 這函數(shù)去資源信號(hào)量的指針作為參數(shù)。銷毀一個(gè)資源信號(hào)量其他的線程可能被阻塞可能導(dǎo)致不確定的行為。一旦函數(shù)返回0,成功。否則-1.
?? 對(duì)于POSIX線程優(yōu)先級(jí)和調(diào)度策略:
?? 調(diào)度策略,和線程優(yōu)先級(jí),以一個(gè)可能執(zhí)行的順序的對(duì)線程列表排序。這部分簡(jiǎn)要的瀏覽這些調(diào)度策略和這線程的優(yōu)先級(jí)。
? Posix線程的調(diào)度策略:
?? 這POSIX線程指定需要一套調(diào)度策略來(lái)實(shí)現(xiàn)。這最流行使用的策略如下:
?? SCHED_FIFO:先進(jìn)先出的調(diào)度策略。
?? SCHED_RR:這round_robin調(diào)度策略防止獨(dú)占CPU資源,循環(huán)執(zhí)行。
他們?cè)趕ched.h頭文件中。這調(diào)度策略sched_policy域pthread_attr_t中指定在pthread_create函數(shù)中或通過(guò)這個(gè)函數(shù)的運(yùn)行期間。
? int poilcy;
? struct sched_param const* param);
?PoSix 線程的優(yōu)先級(jí):
?? 這POSIX Thread API也提供函數(shù)來(lái)矯正基于調(diào)度策略的線程優(yōu)先級(jí)。這線程的優(yōu)先級(jí)被定義使用sched_priority域通過(guò)pthread_attr_t結(jié)構(gòu)來(lái)使用pthread_create函數(shù)時(shí),或者通過(guò)pthread_setschedparam函數(shù)在運(yùn)行期間和提供優(yōu)先級(jí)在sched_param結(jié)構(gòu)。則最小和最大的優(yōu)先級(jí)值基于調(diào)度策略是不同的。這應(yīng)用程序能夠查詢這些數(shù)字通過(guò)使用sched_get_priority_max和sched_get_priority_min函數(shù)。
?
??
?
?
?
總結(jié)
以上是生活随笔為你收集整理的POSIX线程的同步的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 对于原生代码使用Java线程的优缺点
- 下一篇: Echo Socket例子项目