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...