Linux 下的執行緒讀寫鎖

2021-06-16 09:05:53 字數 3386 閱讀 5215

linux 下的執行緒讀寫鎖

有一種寫優先讀寫鎖,有如下特點:

1)多個讀者可以同時進行讀

2)寫者必須互斥(只允許乙個寫者寫,也不能讀者寫者同時進行)

3)寫者優先於讀者(一旦有寫者,則後續讀者必須等待,喚醒時優先考慮寫者)

在solaris 中直接提供了讀寫鎖, 但是在linux 中只提供了執行緒的讀寫鎖, 這裡記錄了一些讀寫鎖的資料.

1.solaris .vs. linux posix 庫函式

solaris 庫(lib 執行緒)linux posix 庫(libp 執行緒)操作

sema_destroy()

sem_destroy()

銷毀訊號狀態。

sema_init()

sem_init()

初始化訊號。

sema_post()

sem_post()

增加訊號。

sema_wait()

sem_wait()

阻止訊號計數。

sema_trywait()

sem_trywait()

減少訊號計數。

mutex_destroy()

pthread_mutex_destroy()

銷毀或禁用與互斥物件相關的狀態。

mutex_init()

pthread_mutex_init()

初始化互斥變數。

mutex_lock()

pthread_mutex_lock()

鎖定互斥物件和塊,直到互斥物件被釋放。

mutex_unlock()

pthread_mutex_unlock()

釋放互斥物件。

cond_broadcast()

pthread_cond_broadcast()

解除對等待條件變數的所有執行緒的阻塞。

cond_destroy()

pthread_cond_destroy()

銷毀與條件變數相關的任何狀態。

cond_init()

pthread_cond_init()

初始化條件變數。

cond_signal()

pthread_cond_signal()

解除等待條件變數的下乙個執行緒的阻塞。

cond_wait()

pthread_cond_wait()

阻止條件變數,並在最後釋放它。

rwlock_init()

pthread_rwlock_init()

初始化讀/寫鎖。

rwlock_destroy()

pthread_rwlock_destroy()

鎖定讀/寫鎖。

rw_rdlock()

pthread_rwlock_rdlock()

讀取讀/寫鎖上的鎖。

rw_wrlock()

pthread_rwlock_wrlock()

寫讀/寫鎖上的鎖。

rw_unlock()

pthread_rwlock_unlock()

解除讀/寫鎖。

rw_tryrdlock()

pthread_rwlock_tryrdlock()

讀取非阻塞讀/寫鎖上的鎖。

rw_trywrlock()

pthread_rwlock_trywrlock()

寫非阻塞讀/寫鎖上的鎖。

2.使用mutex 來實現

設定三個互斥訊號量:

rwmutex        用於寫者與其他讀者/寫者互斥的訪問共享資料

rmutex        用於讀者互斥的訪問讀者計數器readcount

nrmutex        用於寫者等待已進入讀者退出,所有讀者退出前互斥寫操作

var   rwmutex,rmutex,nrmutex:semaphore:=1,1,1;  

int   readcount=0;

cobegin

reader begin

p(rwmutex);

p(rmutex);

readcount++;

if (readcount == 1) p(nrmutex);  //有讀者進入,互斥寫操作

v(rmutex);

v(rwmutex);  //及時釋放讀寫互斥訊號量,允許其它讀、寫程序申請資源讀資料;

p(rmutex);

readcount--;

if(readcount == 0) v(nrmutex);  //所有讀者退出,允許寫更新

v(rmutex);

endwriter begin

p(rwmutex);    //互斥後續其它讀者、寫者

p(nrmutex);    //如有讀者正在讀,等待所有讀者讀完

寫更新;

v(nrmutex);    //允許後續新的第乙個讀者進入後互斥寫操作  

v(rwmutex);    //允許後續新讀者及其它寫者

end  

coend   

3. 利用pthread_cond_* & pthread_mutex_* 實現rw_lock

#include 

#include 

#include 

#include 

using

namespace std;

class rwlock 

void get_shared_lock()

rd_cnt++;

pthread_mutex_unlock(&cnt_mutex); }

void release_shared_lock()

pthread_mutex_unlock(&cnt_mutex); }

void get_exclusive_lock()

wr_cnt++;

pthread_mutex_unlock(&cnt_mutex); }

void release_exclusive_lock()

~rwlock()

};

class test

static

void * exclusive_task_handler(

void * arg)

public :

typedef 

void* (*threadfunc) (

void*);

void start()

} for(

int i=0; iint main()

--------------------------

參考:solaris 執行緒與同步機制之例項

posix執行緒程式設計指南

LINUX下的執行緒同步 mutex和讀寫鎖

用mutex保護的 段,無論讀寫,乙個執行緒占有時,別的執行緒都必須等待。讀寫鎖可以使多個執行緒同時讀取,具體說來如下 當讀寫鎖是寫加鎖狀態時,在這個鎖被解鎖之前,所有試圖對這個鎖加鎖的執行緒都會被阻塞。當讀寫鎖在讀加鎖狀態時,所有試圖以讀模式對它進行加鎖的執行緒都可以得到訪問權,但是如果執行緒希望...

Linux執行緒同步 讀寫鎖

讀寫鎖和互斥量 互斥鎖 很類似,是另一種執行緒同步機制,但不屬於posix標準,可以用來同步同一程序中的各個執行緒。當然如果乙個讀寫鎖存放在多個程序共享的某個記憶體區中,那麼還可以用來進行程序間的同步.和互斥量不同的是 互斥量會把試圖進入已保護的臨界區的執行緒都阻塞 然而讀寫鎖會視當前進入臨界區的執...

linux程式設計 執行緒 讀寫鎖

讀寫鎖通訊機制 讀寫鎖分為讀鎖和寫鎖,功能如下 1 如果某執行緒申請了讀鎖,其他執行緒可以再申請讀鎖,但不能申請寫鎖。2 如果某執行緒申請了寫鎖,則其他執行緒不能申請讀鎖,也不能申請寫鎖。初始化讀寫鎖 int pthread rwlock init pthread rwlock t restrict...