Linux下執行緒同步物件 2 讀寫鎖

2021-05-24 02:05:36 字數 1417 閱讀 8236

上文介紹了linux下執行緒同步物件——互斥量,本文介紹另外linux下同步物件——讀寫鎖。

如果多個執行緒同時讀資源,則不會發生競爭關係,也不會出現資源的不一致性,所以讀資源的時候不需要同步物件保護。但是如果寫某個資源的時候,必須要進行同步保護,否則將會出現不一致性。在上文的互斥量中,不管讀寫都加鎖,這樣對於讀資源操作非常多,但寫資源非常少的情況下,效率會比較低。linux提供了讀寫鎖來解決這種情況下的效率問題。

讀寫鎖分為讀鎖定狀態和寫鎖定狀態,多個執行緒可以同時獲得讀鎖定狀態鎖,進行各自的讀操作。但是寫鎖定狀態只能有乙個執行緒獲得,其他的執行緒執行緒的讀鎖定請求和寫鎖定請求都將會阻塞,直到當前的寫鎖定狀態釋放。

建立和銷毀讀寫鎖用如下函式:

#include int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,

const pthread_rwlockattr_t *restrict attr);

為讀寫鎖加讀鎖定狀態函式如下:

#include int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);

pthread_rwlock_rdlock若當前讀寫鎖為未加鎖狀態或者為讀鎖定狀態,該函式都可以獲得讀寫鎖並返回;若該讀寫鎖為寫鎖定狀態,則該函式將阻塞呼叫執行緒,直到該讀寫鎖的寫鎖定狀態釋放。

pthread_rwlock_tryrdlock若當前讀寫鎖為未加鎖狀態或者為讀鎖定狀態,該函式都可以獲得讀寫鎖並返回;若該讀寫鎖為寫鎖定狀態,則該函式將立即返回錯誤(錯誤碼為ebusy),不阻塞呼叫執行緒。

為讀寫鎖加寫鎖定狀態的函式如下:

#include int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);

pthread_rwlock_wrlock如果當前讀寫鎖狀態為未鎖定,則該函式鎖定該鎖,並立即返回;如果該鎖的狀態為讀鎖定狀態或者寫鎖定狀態,則該函式將阻塞呼叫執行緒,直到該鎖的讀寫狀態被釋放。

pthread_rwlock_trywrlock如果當前讀寫鎖狀態為未鎖定鎖定,則該函式鎖定該鎖,並立即返回;如果該鎖的狀態為讀鎖定狀態或者寫鎖定狀態,則該函式立即返回,並返回錯誤碼ebusy,不阻塞呼叫執行緒。

解除讀寫鎖的鎖定狀態函式如下:

#include int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
不管是讀鎖定狀態和寫鎖定狀態都呼叫這個函式接觸鎖定。

Linux下執行緒同步物件 1 互斥量

程序是linux資源分配的物件,linux會為程序分配虛擬記憶體 4g 和檔案控制代碼等資源,是乙個靜態的概念。執行緒是cpu排程的物件,是乙個動態的概念。乙個程序之中至少包含有乙個或者多個執行緒。這些執行緒共享該程序空間的記憶體和檔案控制代碼資源,多個執行緒競爭地獲得這些資源。為了防止多個執行緒訪...

Linux下執行緒同步物件 1 互斥量

程序是linux資源分配的物件,linux會為程序分配虛擬記憶體 4g 和檔案控制代碼等資源,是乙個靜態的概念。執行緒是cpu排程的物件,是乙個動態的概念。乙個程序之中至少包含有乙個或者多個執行緒。這些執行緒共享該程序空間的記憶體和檔案控制代碼資源,多個執行緒競爭地獲得這些資源。為了防止多個執行緒訪...

linux下執行緒同步之互斥鎖

互斥鎖是多執行緒同步的一種方式,當多個執行緒訪問同乙個變數時,最簡單的方法就是使用乙個互斥鎖 mutex 保護這個共享變數,防止出現資源搶占的問題。下面是未加互斥鎖時 include includepthread mutex t mutex pthread mutex initializer 靜態初...