Unix IPC之讀寫鎖

2022-08-17 06:36:14 字數 2057 閱讀 6202

讀寫鎖比mutex有更高的適用性,可以多個執行緒同時占用讀模式的讀寫鎖,但是只能乙個執行緒占用寫模式的讀寫鎖;

1,當讀寫鎖是寫加鎖狀態時, 在這個鎖被解鎖之前, 所有試圖對這個鎖加鎖的執行緒都會被阻塞.

2,當讀寫鎖在讀加鎖狀態時, 所有試圖以讀模式對它進行加鎖的執行緒都可以得到訪問權,但是以寫模式對它進行枷鎖的執行緒將阻塞;

這種鎖適用對資料結構進行讀的次數比寫的次數多的情況下,因為可以進行讀鎖共享

api介面說明:

1)初始化和銷毀

#include int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);

int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

成功則返回0, 出錯則返回錯誤編號.

2)讀加鎖和寫加鎖

獲取鎖的兩個函式是阻塞操作

#include int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

成功則返回0, 出錯則返回錯誤編號.

3)非阻塞獲得讀鎖和寫鎖

非阻塞的獲取鎖操作, 如果可以獲取則返回0, 否則返回錯誤的ebusy.

#include int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);

成功則返回0, 出錯則返回錯誤編號.

unix網路程式設計-卷2:用互斥鎖和訊號量實現寫者優先的讀寫鎖

typedef struct

pthread_rwlock_t;

int

pthread_rwlock_rdlock(pthread_rwlock_t *rw)

if (result == 0

) rw->rw_refcount++; /*

another reader has a read lock

*/pthread_mutex_unlock(&rw->rw_mutex);

return

(result);}/*

end rdlock

*/

pthread_rwlock_rdlock

int

pthread_rwlock_wrlock(pthread_rwlock_t *rw)

if (result == 0

) rw->rw_refcount = -1

; pthread_mutex_unlock(&rw->rw_mutex);

return

(result);}/*

end wrlock

*/

pthread_rwlock_wrlock

int

pthread_rwlock_unlock(pthread_rwlock_t *rw)

else

if (rw->rw_nwaitreaders > 0

) result = pthread_cond_broadcast(&rw->rw_condreaders);

pthread_mutex_unlock(&rw->rw_mutex);

return

(result);}/*

end unlock

*/

pthread_rwlock_unlock

pthread之讀寫鎖

讀寫鎖是用來解決讀者寫者問題的,讀操作可以共享,寫操作是排他的,讀可以有多個在讀,寫只有唯一個在寫,同時寫的時候不允許讀。具有強讀者同步和強寫者同步兩種形式 強讀者同步 當寫者沒有進行寫操作,讀者就可以訪問 強寫者同步 當所有寫者都寫完之後,才能進行讀操作,讀者需要最新的資訊,一些事實性較高的系統可...

JUC之讀寫鎖

是什麼?讀寫分離的鎖。locks包下的 lock condition readwritelock 裡面的readwritelock 讀寫鎖 維護了一對讀寫操作。讀的鎖可以共享 又叫共享鎖 寫的鎖獨佔 又叫獨佔鎖 即寫操作只能開始寫 寫結束,中間不能插入任何寫的操作。怎麼用?如果沒有鎖的情況 publ...

LINUX鎖之讀寫鎖(C )

讀寫訊號量 rw semaphore 又叫讀寫鎖。允許多個讀者同時持有該訊號量 當有乙個寫者持有該訊號量時,其他讀者跟寫者不可持有該訊號量 當寫者寫完後,可以降級為讀者。讀寫訊號量使用於讀多寫少的情況下使用。declare rwsem name 宣告乙個讀寫訊號量,並對其初始化 struct rw ...