線程同步

線程同步

互斥量
:從本質上是一把鎖,在訪問共享資源前對互斥量加鎖,在訪問完後解鎖,
對互斥量加鎖後任何其他試圖再次對其加鎖都會被阻塞,知道當前線程
對互斥量解鎖。


互斥量初始化
1)靜態初始化
將互斥量設置爲PTHREAD_MUTEX_INITIALIZER
或者調用怕pthread_mutex_init函數


2)動態初始化
#include<pthread.h>
int pthread_mutex_init(pthread_mutex_t * mutex, const pthread_mutexattr_t *attr);
成功-- 0,出錯--返回錯誤編號
參數:
attr -- 若設置爲NULL,則是默認屬性


3)釋放鎖佔的資源
int pthread_mutex_destroy(pthread_mutex_t *mutex);
成功-- 0,出錯--返回錯誤編號


4)對互斥量加鎖和解鎖
#include<pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
成功--0,出錯--返回錯誤編號


pthread_mutex_trylock函數對互斥量加鎖,若互斥量已經被
加鎖,則返回出錯碼EBUSY


5)帶有超時的互斥鎖函數
#include<pthread.h>
#include<time.h>
int pthread_mutex_timedlock(pthread_mutex_t *mutex, const struct timespec *tsptr);
成功--0,出錯--返回錯誤編號
超時--返回ETIMEDOUT
參數:
tsptr -- 超時指定願意等待的絕對時間,使用的時候先獲取當前時間,然後將當前時間加上
願意等待是相對時間,得到最終設置的絕對時間。


 
讀寫鎖:讀寫鎖和互斥量相似,不過讀寫鎖提供更高的並行性。讀寫鎖有三種狀態:
讀模式下加鎖、寫模式 下加鎖、不加鎖。一次只有一個線程有寫模式的讀寫
鎖,但是可以有多個線程同時佔有讀模式下的讀寫鎖。
讀寫鎖在寫加鎖狀態時,所有試圖對讀寫鎖加鎖的線程都會被阻塞;讀寫鎖在讀加鎖
狀態時,可以對讀寫鎖讀加鎖,但是不能對其寫加鎖,還是有一點就是當有一個寫加鎖
線程在阻塞等待時,後面來的讀加鎖也會被阻塞,這樣是爲了讀鎖長期佔有讀寫鎖。

1)靜態初始化
讀寫鎖設置爲 PTHREAD_RWLOCK_INITIALIZER
或者調用怕pthread_rwlock_init函數


2)動態初始化
#include<pthread.h>
int pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr);
成功--0,出錯--返回錯誤編號


3)釋放鎖佔的資源
#include<pthread.h>
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
成功--0,出錯--返回錯誤編號


4)對讀寫鎖加鎖和解鎖
#include<pthread.h>
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
成功--0,出錯--返回錯誤編號


5)帶有超時的讀寫鎖函數
#include<time.h>
#include<pthread.h>
int pthread_rwlock_timedrdlock(pthread_rwlock_t *rwlock, const timespec *tsptr);
int pthread_rwlock_timedwrlock(pthread_rwlock_t *rwlock, const timespec *tsptr);
成功--0,出錯--返回錯誤編號
超時--返回ETIMEDOUT



條件變量 條件變量給線程提供了一個回合的場所。條件變量和互斥量一起使用時,允許線程以
無競爭的方式等待特定的條件發生。條件本身是被互斥量保護的,線程改變條件狀態
之前必須首先鎖住互斥量。

1)靜態初始化
條件變量設置爲PTHREAD_COND_INITIALIZER
或者調用怕pthread_cond_init函數


2)動態初始化
#include<pthread.h>
int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);
成功--0,出錯--返回錯誤編號


3)釋放鎖佔的資源
#include<pthread.h>
int pthread_cond_destroy(pthread_cond_t *cond);
成功--0,出錯--返回錯誤編號


4)等待條件變量變爲真
#include<pthread.h>
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
int pthread_cond_timewait(pthread_cond_t *cond, pthread_mutex_t *mutex,const struct timespec *tsptr);
成功--0,出錯--返回錯誤編號
超時--返回ETIMEDOUT


5)喚醒等待該條件的線程
#include<pthread.h>
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);
成功--0,出錯--返回錯誤編號


pthread_cond_broadcast函數喚醒所有等待此條件的線程,
pthread_cond_signal函數喚醒一個或一個以上等待此條件的線程。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章