Linux——線程同步 讀寫鎖
目錄
一、基本概念
1.1 讀寫鎖的基本概念
1.2 讀寫鎖的優點
1.3 讀寫鎖的實現?
1.4 代碼實現
一、基本概念
線程同步中的讀寫鎖(Read-Write Lock),也常被稱為共享-獨占鎖(Shared-Exclusive Lock),是一種用于控制對共享資源的并發訪問的同步機制。它允許多個線程同時讀取共享資源,但只允許一個線程寫入共享資源。讀寫鎖的設計目的是在多線程環境中提高并發性能,特別是在讀操作遠多于寫操作的場景中。讀寫鎖與互斥鎖區別就是讀鎖和寫鎖是分開的
1.1 讀寫鎖的基本概念
讀寫鎖通常由兩個鎖組成:
-
讀鎖(Shared Lock):允許多個線程同時獲取讀鎖,這意味著多個線程可以同時讀取共享資源。當至少有一個線程持有讀鎖時,其他線程不能獲取寫鎖。
-
寫鎖(Exclusive Lock):只允許一個線程獲取寫鎖,這意味著在任何時刻只有一個線程可以寫入共享資源。當線程持有寫鎖時,其他線程既不能獲取讀鎖也不能獲取寫鎖。
1.2 讀寫鎖的優點
-
提高并發性:在讀取操作遠多于寫入操作的情況下,讀寫鎖可以顯著提高程序的并發性能,因為它允許多個線程同時讀取共享資源。
-
避免寫饑餓:由于寫鎖的優先級通常高于讀鎖,可以避免長時間只進行讀操作而使寫操作饑餓的情況。
-
靈活性:讀寫鎖提供了一種靈活的機制來控制對共享資源的訪問,可以根據實際需要選擇獲取讀鎖或寫鎖。
1.3 讀寫鎖的實現?
pthread_rwlock_init 初始化讀寫鎖
pthread_rwlock_rdlock?獲取(鎖定)一個讀寫鎖以進行讀取。
pthread_rwlock_wrlock?獲取(鎖定)一個讀寫鎖以進行寫入。
pthread_rwlock_unlock 釋放一個讀寫鎖 解鎖
pthread_rwlock_destroy 銷毀一個讀寫鎖
1.4 代碼實現
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>pthread_rwlock_t lock;//定義了一個變量lockvoid* fun1(void* arg)//模擬讀同時進行和2
{for(int i=0;i<20;i++){pthread_rwlock_rdlock(&lock);printf("fun1 read start: \n");sleep(1);printf("fun1 read end: \n");pthread_rwlock_unlock(&lock);sleep(1);}
}void* fun2(void* arg)//讀
{for(int i=0;i<10;i++){pthread_rwlock_rdlock(&lock);printf("fun2 read start: \n");sleep(1);printf("fun2 read end: \n");pthread_rwlock_unlock(&lock);sleep(1);}
}void* fun3(void* arg)//寫 只允許一個進行
{for(int i=0;i<8;i++){pthread_rwlock_wrlock(&lock);sleep(1);printf(" fun3 write start: \n");sleep(1);printf(" fun3 write end: \n");pthread_rwlock_unlock(&lock);sleep(1);}
}
int main()
{pthread_rwlock_init(&lock,NULL);pthread_t id1,id2,id3;pthread_create(&id1,NULL,fun1,NULL);pthread_create(&id2,NULL,fun2,NULL);pthread_create(&id3,NULL,fun3,NULL);pthread_join(id1,NULL);pthread_join(id2,NULL);pthread_join(id3,NULL);pthread_rwlock_destroy(&lock);
}
讀寫鎖允許多個線程同時讀取共享資源,但只允許一個線程寫入共享資源。
這里定義了一個全局的讀寫鎖
lock,用于控制對共享資源的訪問。這段代碼通過使用讀寫鎖來同步多個線程對共享資源的訪問。讀線程可以同時訪問共享資源,而寫線程則需要獨占訪問。通過這種方式,可以有效地提高程序的并發性能,特別是在讀操作遠多于寫操作的場景中。
