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