使用讀寫鎖
配置讀寫鎖的屬性之後,即可初始化讀寫鎖。以下函數用於初始化或銷燬讀寫鎖、鎖定或解除鎖定讀寫鎖或嘗試鎖定讀寫鎖。下表列出了本節中討論的用來處理讀寫鎖的函數。
表 4–9 處理讀寫鎖的例程
操作 |
相關函數說明 |
---|---|
初始化讀寫鎖 |
|
讀取讀寫鎖中的鎖 |
|
讀取非阻塞讀寫鎖中的鎖 |
|
寫入讀寫鎖中的鎖 |
|
寫入非阻塞讀寫鎖中的鎖 |
|
解除鎖定讀寫鎖 |
|
銷燬讀寫鎖 |
初始化讀寫鎖
使用 pthread_rwlock_init(3C) 可以通過 attr 所引用的屬性初始化 rwlock 所引用的讀寫鎖。
pthread_rwlock_init 語法
#include <pthread.h> int pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr); pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;
如果 attr 爲 NULL,則使用缺省的讀寫鎖屬性,其作用與傳遞缺省讀寫鎖屬性對象的地址相同。初始化讀寫鎖之後,該鎖可以使用任意次數,而無需重新初始化。成功初始化之後,讀寫鎖的狀態會變爲已初始化和未鎖定。如果調用 pthread_rwlock_init() 來指定已初始化的讀寫鎖,則結果是不確定的。如果讀寫鎖在使用之前未初始化,則結果是不確定的。對於 Solaris 線程,請參見rwlock_init 語法。
如果缺省的讀寫鎖屬性適用,則 PTHREAD_RWLOCK_INITIALIZER 宏可初始化以靜態方式分配的讀寫鎖,其作用與通過調用 pthread_rwlock_init() 並將參數 attr 指定爲 NULL 進行動態初始化等效,區別在於不會執行錯誤檢查。
pthread_rwlock_init 返回值
如果成功,pthread_rwlock_init() 會返回零。否則,將返回用於指明錯誤的錯誤號。
如果 pthread_rwlock_init() 失敗,將不會初始化 rwlock,並且 rwlock 的內容是不確定的。
EINVAL
描述:attr 或 rwlock 指定的值無效。
獲取讀寫鎖中的讀鎖
pthread_rwlock_rdlock(3C) 可用來向 rwlock 所引用的讀寫鎖應用讀鎖。
pthread_rwlock_rdlock 語法
#include <pthread.h> int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock );
如果寫入器未持有讀鎖,並且沒有任何寫入器基於該鎖阻塞,則調用線程會獲取讀鎖。如果寫入器未持有讀鎖,但有多個寫入器正在等待該鎖時,調用線程是否能獲取該鎖是不確定的。如果某個寫入器持有讀鎖,則調用線程無法獲取該鎖。如果調用線程未獲取讀鎖,則它將阻塞。調用線程必須獲取該鎖之後,才能從 pthread_rwlock_rdlock() 返回。如果在進行調用時,調用線程持有 rwlock 中的寫鎖,則結果是不確定的。
爲避免寫入器資源匱乏,允許在多個實現中使寫入器的優先級高於讀取器。例如,Solaris 線程實現中寫入器的優先級高於讀取器。 請參見rw_rdlock 語法。
一個線程可以在 rwlock 中持有多個併發的讀鎖,該線程可以成功調用 pthread_rwlock_rdlock() n 次。該線程必須調用pthread_rwlock_unlock() n 次才能執行匹配的解除鎖定操作。
如果針對未初始化的讀寫鎖調用 pthread_rwlock_rdlock(),則結果是不確定的。
線程信號處理程序可以處理傳送給等待讀寫鎖的線程的信號。從信號處理程序返回後,線程將繼續等待讀寫鎖以執行讀取,就好像線程未中斷一樣。
pthread_rwlock_rdlock 返回值
如果成功,pthread_rwlock_rdlock() 會返回零。否則,將返回用於指明錯誤的錯誤號。
EINVAL
描述:attr 或 rwlock 指定的值無效。
讀取非阻塞讀寫鎖中的鎖
pthread_rwlock_tryrdlock(3C) 應用讀鎖的方式與 pthread_rwlock_rdlock() 類似,區別在於如果任何線程持有 rwlock 中的寫鎖或者寫入器基於rwlock 阻塞,則 pthread_rwlock_tryrdlock() 函數會失敗。對於 Solaris 線程,請參見rw_tryrdlock 語法。
pthread_rwlock_tryrdlock 語法
#include <pthread.h> int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
pthread_rwlock_tryrdlock 返回值
如果獲取了用於在 rwlock 所引用的讀寫鎖對象中執行讀取的鎖,則 pthread_rwlock_tryrdlock() 將返回零。如果沒有獲取該鎖,則返回用於指明錯誤的錯誤號。
EBUSY
描述:無法獲取讀寫鎖以執行讀取,因爲寫入器持有該鎖或者基於該鎖已阻塞。
寫入讀寫鎖中的鎖
pthread_rwlock_wrlock(3C) 可用來向 rwlock 所引用的讀寫鎖應用寫鎖。
pthread_rwlock_wrlock 語法
#include <pthread.h> int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock );
如果沒有其他讀取器線程或寫入器線程持有讀寫鎖 rwlock,則調用線程將獲取寫鎖。否則,調用線程將阻塞。調用線程必須獲取該鎖之後,才能從pthread_rwlock_wrlock() 調用返回。如果在進行調用時,調用線程持有讀寫鎖(讀鎖或寫鎖),則結果是不確定的。
爲避免寫入器資源匱乏,允許在多個實現中使寫入器的優先級高於讀取器。(例如,Solaris 線程實現允許寫入器的優先級高於讀取器。請參見rw_wrlock語法。)
如果針對未初始化的讀寫鎖調用 pthread_rwlock_wrlock(),則結果是不確定的。
線程信號處理程序可以處理傳送給等待讀寫鎖以執行寫入的線程的信號。從信號處理程序返回後,線程將繼續等待讀寫鎖以執行寫入,就好像線程未中斷一樣。
pthread_rwlock_wrlock 返回值
如果獲取了用於在 rwlock 所引用的讀寫鎖對象中執行寫入的鎖,則 pthread_rwlock_rwlock() 將返回零。如果沒有獲取該鎖,則返回用於指明錯誤的錯誤號。
寫入非阻塞讀寫鎖中的鎖
pthread_rwlock_trywrlock(3C) 應用寫鎖的方式與 pthread_rwlock_wrlock() 類似,區別在於如果任何線程當前持有用於讀取和寫入的 rwlock,則pthread_rwlock_trywrlock() 函數會失敗。對於 Solaris 線程,請參見 rw_trywrlock 語法。
pthread_rwlock_trywrlock 語法
#include <pthread.h> int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
如果針對未初始化的讀寫鎖調用 pthread_rwlock_trywrlock(),則結果是不確定的。
線程信號處理程序可以處理傳送給等待讀寫鎖以執行寫入的線程的信號。從信號處理程序返回後,線程將繼續等待讀寫鎖以執行寫入,就好像線程未中斷一樣。
pthread_rwlock_trywrlock 返回值
如果獲取了用於在 rwlock 引用的讀寫鎖對象中執行寫入的鎖,則 pthread_rwlock_trywrlock() 將返回零。否則,將返回用於指明錯誤的錯誤號。
EBUSY
描述:無法爲寫入獲取讀寫鎖,因爲已爲讀取或寫入鎖定該讀寫鎖。
解除鎖定讀寫鎖
pthread_rwlock_unlock(3C) 可用來釋放在 rwlock 引用的讀寫鎖對象中持有的鎖。
pthread_rwlock_unlock 語法
#include <pthread.h> int pthread_rwlock_unlock (pthread_rwlock_t *rwlock);
如果調用線程未持有讀寫鎖 rwlock,則結果是不確定的。對於 Solaris 線程,請參見rw_unlock 語法。
如果通過調用 pthread_rwlock_unlock() 來釋放讀寫鎖對象中的讀鎖,並且其他讀鎖當前由該鎖對象持有,則該對象會保持讀取鎖定狀態。如果pthread_rwlock_unlock() 釋放了調用線程在該讀寫鎖對象中的最後一個讀鎖,則調用線程不再是該對象的屬主。如果 pthread_rwlock_unlock()釋放了該讀寫鎖對象的最後一個讀鎖,則該讀寫鎖對象將處於無屬主、解除鎖定狀態。
如果通過調用 pthread_rwlock_unlock() 釋放了該讀寫鎖對象的最後一個寫鎖,則該讀寫鎖對象將處於無屬主、解除鎖定狀態。
如果 pthread_rwlock_unlock() 解除鎖定該讀寫鎖對象,並且多個線程正在等待獲取該對象以執行寫入,則通過調度策略可確定獲取該對象以執行寫入的線程。如果多個線程正在等待獲取讀寫鎖對象以執行讀取,則通過調度策略可確定等待線程獲取該對象以執行寫入的順序。如果多個線程基於 rwlock中的讀鎖和寫鎖阻塞,則無法確定讀取器和寫入器誰先獲得該鎖。
如果針對未初始化的讀寫鎖調用 pthread_rwlock_unlock(),則結果是不確定的。
pthread_rwlock_unlock 返回值
如果成功,pthread_rwlock_unlock() 會返回零。否則,將返回用於指明錯誤的錯誤號。
銷燬讀寫鎖
pthread_rwlock_destroy(3C) 可用來銷燬 rwlock 引用的讀寫鎖對象並釋放該鎖使用的任何資源。
pthread_rwlock_destroy 語法
#include <pthread.h> int pthread_rwlock_destroy(pthread_rwlock_t *rwlock); pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;
在再次調用 pthread_rwlock_init() 重新初始化該鎖之前,使用該鎖所產生的影響是不確定的。實現可能會導致 pthread_rwlock_destroy() 將rwlock 所引用的對象設置爲無效值。如果在任意線程持有 rwlock 時調用 pthread_rwlock_destroy(),則結果是不確定的。嘗試銷燬未初始化的讀寫鎖會產生不確定的行爲。已銷燬的讀寫鎖對象可以使用 pthread_rwlock_init() 來重新初始化。銷燬讀寫鎖對象之後,如果以其他方式引用該對象,則結果是不確定的。對於 Solaris 線程,請參見rwlock_destroy 語法。
pthread_rwlock_destroy 返回值
如果成功,pthread_rwlock_destroy() 會返回零。否則,將返回用於指明錯誤的錯誤號。
EINVAL
描述:attr 或 rwlock 指定的值無效。
轉自:http://hi.baidu.com/andyzcj/blog/item/081b7018cf41aa4b43a9ad87.html