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爲寫者線程。       
  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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章