1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
#include <stdio.h> #include <Windows.h> #include <pthread.h> #include <semaphore.h> #pragma comment(lib, "pthreadVC2.lib") //必須加上這句 pthread_t t1; //pthread_t變量t1,用於獲取線程1的ID pthread_t t2; //pthread_t變量t2,用於獲取線程2的ID pthread_rwlock_t rwlock; //聲明讀寫鎖 int data=1; //共享資源 void* readerM(void* arg) { while(1) { pthread_rwlock_rdlock(&rwlock); //讀者加讀鎖 printf("M 讀者讀出: %d \n",data); //讀取共享資源 pthread_rwlock_unlock(&rwlock); //讀者釋放讀鎖 Sleep(1200); } return NULL; } void* readerN(void* arg) { while(1) { pthread_rwlock_rdlock(&rwlock); printf(" N讀者讀出: %d \n",data); pthread_rwlock_unlock(&rwlock); Sleep(700); } return NULL; } void* writerA(void* arg) { while(1) { pthread_rwlock_wrlock(&rwlock); //寫者加寫鎖 data++; //對共享資源寫數據 printf(" A寫者寫入: %d\n",data); pthread_rwlock_unlock(&rwlock); //釋放寫鎖 Sleep(2000); } return NULL; } void* writerB(void* arg) { while(1) { pthread_rwlock_wrlock(&rwlock); data++; printf(" B寫者寫入: %d\n",data); pthread_rwlock_unlock(&rwlock); Sleep(2000); } return NULL; } void main(int argc,char** argv) { pthread_rwlock_init(&rwlock, NULL); //初始化讀寫鎖 pthread_create(&t1,NULL,readerM,NULL); pthread_create(&t1,NULL,readerN,NULL); pthread_create(&t2,NULL,writerA,NULL); pthread_create(&t2,NULL,writerB,NULL); pthread_rwlock_destroy(&rwlock); //銷燬讀寫鎖 Sleep(10000000); return; }
|
linux多線程之讀寫鎖
Pthread是 POSIX threads 的簡稱,是POSIX的線程標準。
pthread讀寫鎖把對共享資源的訪問者分爲讀者和寫者,讀者只對共享資源進行讀訪問,寫者只對共享資源進行寫操作。在互斥機制,讀者和寫者都需要獨立獨佔互斥量以獨佔共享資源,在讀寫鎖機制下,允許同時有多個讀者讀訪問共享資源,只有寫者才需要獨佔資源。相比互斥機制,讀寫機制由於允許多個讀者同時讀訪問共享資源,進一步提高了多線程的併發度。
1.讀寫鎖機制:
寫者:寫者使用寫鎖,如果當前沒有讀者,也沒有其他寫者,寫者立即獲得寫鎖;否則寫者將等待,直到沒有讀者和寫者。
讀者:讀者使用讀鎖,如果當前沒有寫者,讀者立即獲得讀鎖;否則讀者等待,直到沒有寫者。
2.讀寫鎖特性:
同一時刻只有一個線程可以獲得寫鎖,同一時刻可以有多個線程獲得讀鎖。
讀寫鎖出於寫鎖狀態時,所有試圖對讀寫鎖加鎖的線程,不管是讀者試圖加讀鎖,還是寫者試圖加寫鎖,都會被阻塞。
讀寫鎖處於讀鎖狀態時,有寫者試圖加寫鎖時,之後的其他線程的讀鎖請求會被阻塞,以避免寫者長時間的不寫鎖。
3.讀寫鎖基本函數:
# include<pthread.h>
讀寫鎖初始化:
int pthread_rwlock_init(pthread_rwlock_t * rwlock,
const pthread_rwlockattr_t * attr);
該函數第一個參數爲讀寫鎖指針,第二個參數爲讀寫鎖屬性指針。函數按讀寫鎖屬性對讀寫鎖進行初始化。
加讀鎖:
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_destroy(pthread_rwlock_t *rwlock);
該函數參數爲讀寫鎖指針。函數用於銷燬讀寫鎖。
4.牛刀小試:
示例使用讀寫鎖,對共享資源data進行讀寫同步,線程readerM,readerN爲讀者線程,線程writerA,writerB爲寫者線程。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.