頭文件:#include <pthread.h>
讀寫鎖分為讀鎖和寫鎖,規則如下:
1,如果某線程申請了讀鎖,其它線程可以再申請讀鎖,但不能申請寫鎖。
2,如果某線程申請了寫鎖,其它線程不能申請讀鎖,也不能申請寫鎖。
pthread_rwlock_init
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,
const pthread_rwlockattr_t *restrict attr);
功能:
用來初始化 rwlock 所指向的讀寫鎖。
?
參數:
rwlock:指向要初始化的讀寫鎖指針。
attr:讀寫鎖的屬性指針。如果 attr 為 NULL 則會使用默認的屬性初始化讀寫鎖,否則使用指定的 attr 初始化讀寫鎖。
?
可以使用宏 PTHREAD_RWLOCK_INITIALIZER 靜態初始化讀寫鎖,比如:
pthread_rwlock_t my_rwlock = PTHREAD_RWLOCK_INITIALIZER;
?
這種方法等價于使用 NULL 指定的 attr 參數調用 pthread_rwlock_init() 來完成動態初始化,不同之處在于PTHREAD_RWLOCK_INITIALIZER 宏不進行錯誤檢查。
?
返回值:
成功:0,讀寫鎖的狀態將成為已初始化和已解鎖。
失敗:非 0 錯誤碼。
pthread_rwlock_destroy
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
功能:
用于銷毀一個讀寫鎖,并釋放所有相關聯的資源(所謂的所有指的是由 pthread_rwlock_init() 自動申請的資源) 。
參數:
rwlock:讀寫鎖指針。
返回值:
成功:0
失敗:非 0 錯誤碼
pthread_rwlock_rdlock
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
功能:
以阻塞方式在讀寫鎖上獲取讀鎖(讀鎖定)。
如果沒有寫者持有該鎖,并且沒有寫者阻塞在該鎖上,則調用線程會獲取讀鎖。
如果調用線程未獲取讀鎖,則它將阻塞直到它獲取了該鎖。一個線程可以在一個讀寫鎖上多次執行讀鎖定。
線程可以成功調用 pthread_rwlock_rdlock() 函數 n 次,但是之后該線程必須調用 pthread_rwlock_unlock() 函數 n 次才能解除鎖定。
參數:
rwlock:讀寫鎖指針。
返回值:
成功:0
失敗:非 0 錯誤碼
pthread_rwlock_tryrdlock
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
-用于嘗試以非阻塞的方式來在讀寫鎖上獲取讀鎖。
-如果有任何的寫者持有該鎖或有寫者阻塞在該讀寫鎖上,則立即失敗返回。
pthread_rwlock_wrlock
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
功能:
在讀寫鎖上獲取寫鎖(寫鎖定)。
如果沒有寫者持有該鎖,并且沒有寫者讀者持有該鎖,則調用線程會獲取寫鎖。
如果調用線程未獲取寫鎖,則它將阻塞直到它獲取了該鎖。
參數:
rwlock:讀寫鎖指針。
返回值:
成功:0
失敗:非 0 錯誤碼
pthread_rwlock_trywrlock
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
-用于嘗試以非阻塞的方式來在讀寫鎖上獲取寫鎖。
-如果有任何的讀者或寫者持有該鎖,則立即失敗返回。
pthread_rwlock_unlock
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
功能:
無論是讀鎖或寫鎖,都可以通過此函數解鎖。
參數:
rwlock:讀寫鎖指針。
返回值:
成功:0
失敗:非 0 錯誤碼
?
測試程序
pthread_rwlock_t rwlock;
int num = 1;
?
void *fun1(void *arg)
{
while (1)
{
pthread_rwlock_rdlock(&rwlock);
printf("read num first===%d\n", num);
pthread_rwlock_unlock(&rwlock);
sleep(1);
}
}
?
void *fun2(void *arg)
{
while (1)
{
pthread_rwlock_rdlock(&rwlock);
printf("read num second===%d\n", num);
pthread_rwlock_unlock(&rwlock);
sleep(2);
}
}
?
void *fun3(void *arg)
{
while (1)
{
?
pthread_rwlock_wrlock(&rwlock);
num++;
printf("write thread first\n");
pthread_rwlock_unlock(&rwlock);
sleep(2);
}
}
?
void *fun4(void *arg)
{
while (1)
{
?
pthread_rwlock_wrlock(&rwlock);
num++;
printf("write thread second\n");
pthread_rwlock_unlock(&rwlock);
sleep(1);
}
}
?
int main()
{
pthread_t ptd1, ptd2, ptd3, ptd4;
?
pthread_rwlock_init(&rwlock, NULL);
pthread_create(&ptd1, NULL, fun1, NULL);
pthread_create(&ptd2, NULL, fun2, NULL);
pthread_create(&ptd3, NULL, fun3, NULL);
pthread_create(&ptd4, NULL, fun4, NULL);
//等待線程結束,回收其資源
pthread_join(ptd1, NULL);
pthread_join(ptd2, NULL);
pthread_join(ptd3, NULL);
pthread_join(ptd4, NULL);
?
pthread_rwlock_destroy(&rwlock);
return 0;
}