併發操作:對於某一資料,多使用者可以併發的讀取資料,但是同時只可以有乙個使用者進行修改操作。
讀寫鎖(read-write lock)
一 綜述
在一些程式中存在讀者寫者問題,也就是說,對某些資源的訪問會 存在兩種可能的情況,一種是訪問必須是排它行的,就是獨佔的意思,這稱作寫操作;另一種情況就是訪問方式可以是共享的,就是說可以有多個執行緒同時去訪問某個資源,這種就稱作讀操作。這個問題模型是從對檔案的讀寫操作中引申出來的。
讀寫鎖比起mutex具有更高的適用性,具有更高的並行性,可以有多個執行緒同時占用讀模式的讀寫鎖,但是只能有乙個執行緒占用寫模式的讀寫鎖,讀寫鎖的三種狀態:
1.當讀寫鎖是寫加鎖狀態時,在這個鎖被解鎖之前,所有試圖對這個鎖加鎖的執行緒都會被阻塞
2.當讀寫鎖在讀加鎖狀態時,所有試圖以讀模式對它進行加鎖的執行緒都可以得到訪問權,但是以寫模式對它進行加鎖的執行緒將會被阻塞
3.當讀寫鎖在讀模式的鎖狀態時,如果有另外的執行緒試圖以寫模式加鎖,讀寫鎖通常會阻塞隨後的讀模式鎖的請求,這樣可以避免讀模式鎖長期占用,而等待的寫模式鎖請求則長期阻塞。
讀寫鎖最適用於對資料結構的讀操作次數多於寫操作的場合,因為,讀模式鎖定時可以共享,而寫模式鎖定時只能某個執行緒獨佔資源,因而,讀寫鎖也可以叫做個共享-獨佔鎖。
處理讀者-寫者問題的兩種常見策略是強讀者同步(strong reader synchronization)和強寫者同步(strong writer synchronization). 在強讀者同步中,總是給讀者更高的優先權,只要寫者當前沒有進行寫操作,讀者就可以獲得訪問許可權;而在強寫者同步中,則往往將優先權交付給寫者,而讀者只能等到所有正在等待的或者是正在執行的寫者結束以後才能執行。關於讀者-寫者模型中,由於讀者往往會要求檢視最新的資訊記錄,所以航班訂票系統往往會使用強寫者同步策略,而圖書館查閱系統則採用強讀者同步策略。
讀寫鎖機制是由posix提供的,如果寫者沒有持有讀寫鎖,那麼所有的讀者多可以持有這把鎖,而一旦有某個寫者阻塞在上鎖的時候,那麼就由posix系統來決定是否允許讀者獲取該鎖。
二 讀寫鎖相關的api
1.初始化和銷毀讀寫鎖
對於讀寫鎖變數的初始化可以有兩種方式,一種是通過給乙個靜態分配的讀寫鎖賦予常值pthread_rwlock_initializer來初始化它,另一種方法就是通過呼叫pthread_rwlock_init()來動態的初始化。而當某個執行緒不再需要讀寫鎖的時候,可以通過呼叫pthread_rwlock_destroy來銷毀該鎖。函式原型如下:
#include
int pthread_rwlock_init(pthread_rwlock_t *rwptr, const pthread_rwlockattr_t *attr);
int pthread_rwlock_destroy(pthread_rwlock_t *rwptr);
這兩個函式如果執行成功均返回0,如果出錯則返回錯誤碼。
在釋放某個讀寫鎖占用的記憶體之前,要先通過pthread_rwlock_destroy對讀寫鎖進行清理,釋放由pthread_rwlock_init所分配的資源。
在初始化某個讀寫鎖的時候,如果屬性指標attr是個空指標的話,表示預設的屬性;如果想要使用非預設屬性,則要使用到下面的兩個函式:
#include
int pthread_rwlockattr_init(pthread_rwlockattr_t *attr);
int pthread_rwlockattr_destroy(pthread_rwlockatttr_t *attr);
這兩個函式同樣的,如果執行成功返回0,失敗返回錯誤碼。
這裡還需要說明的是,當初始化讀寫鎖完畢以後呢,該鎖就處於乙個非鎖定狀態。
資料型別為pthread_rwlockattr_t的某個屬性物件一旦初始化了,就可以通過不同的函式呼叫來啟用或者是禁用某個特定的屬性。
2.獲取和釋放讀寫鎖
讀寫鎖的資料型別是pthread_rwlock_t,如果這個資料型別中的某個變數是靜態分配的,那麼可以通過給它賦予常值pthread_rwlock_initializar來初始化它。pthread_rwlock_rdlock()用來獲取讀出鎖,如果相應的讀出鎖已經被某個寫入者占有,那麼就阻塞呼叫執行緒。pthread_rwlock_wrlock()用來獲取乙個寫入鎖,如果相應的寫入鎖已經被其它寫入者或者乙個或多個讀出者占有,那麼就阻塞該呼叫執行緒;pthread_rwlock_unlock()用來釋放乙個讀出或者寫入鎖。函式原型如下:
#include
#include
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwptr);
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwptr);
同樣地,這兩個函式呼叫成功返回0,失敗返回錯誤碼。
#include
#include
#include
char str[100];
pthread_rwlock_t rwlock;
void *thread_write(void *arg)
return (void *)0;
}void *thread_read(void *arg)
return (void *)0;
}//讀寫鎖的操作
int main(void)
pthread_join(wthrid,null);
for(i = 0;i < 5;i++)
//銷毀讀寫鎖
pthread_rwlock_destroy(&rwlock);
return
0;}
多程序讀寫鎖
多程序程式設計的核心技術是程序間的同步 通訊與互斥訪問 一 程序間的通訊 1 管道 2 system v訊號量 3 共享記憶體 4 訊息佇列 5 訊號 6 套接字 二 程序間對資源的互斥訪問 條件變數 訊號量讀寫鎖 記錄鎖 自旋鎖原子鎖 順序鎖 記錄鎖 int fcntl int fd,int cm...
linux程序讀寫鎖
讀寫鎖比mutex有更高的適用性,可以多個執行緒同時占用讀模式的讀寫鎖,但是只能乙個執行緒占用寫模式的讀寫鎖。1.當讀寫鎖是寫加鎖狀態時,在這個鎖被解鎖之前,所有試圖對這個鎖加鎖的執行緒都會被阻塞 2.當讀寫鎖在讀加鎖狀態時,所有試圖以讀模式對它進行加鎖的執行緒都可以得到訪問權,但是以寫模式對它進行...
讀寫鎖與程序守護
一 讀寫鎖 一種交易場所 變數 陣列 鍊錶等其他資料結構 兩種角色 讀者 寫者 三種關係 讀者和寫者之間沒有關係 寫者與寫者之間互斥 讀者與寫者之間同步和互斥關係 讀者與讀者之間共享,讀者與寫者之間必須等一方解鎖,另一方才能加鎖 讀者與寫者執行緒同時競爭鎖,寫者會優先獲取到鎖 1.案例 includ...