使用讀寫鎖 (多線程編程指南)

配置讀寫鎖的屬性以後,便可初始化讀寫鎖。如下函數用於初始化或銷燬讀寫鎖、鎖定或解除鎖定讀寫鎖或嘗試鎖定讀寫鎖。下表列出了本節中討論的用來處理讀寫鎖的函數。併發

表 4–9 處理讀寫鎖的例程 讀取非阻塞讀寫鎖中的鎖函數

寫入非阻塞讀寫鎖中的鎖線程

初始化讀寫鎖對象

使用 能夠經過 attr 所引用的屬性初始化 rwlock 所引用的讀寫鎖。資源

#include <pthread.h> int pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr); pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;it

若是 attr 爲 NULL,則使用缺省的讀寫鎖屬性,其做用與傳遞缺省讀寫鎖屬性對象的地址相同。初始化讀寫鎖以後,該鎖可使用任意次數,而無需從新初始化。成功初始化以後,讀寫鎖的狀態會變爲已初始化和未鎖定。若是調用 pthread_rwlock_init() 來指定已初始化的讀寫鎖,則結果是不肯定的。若是讀寫鎖在使用以前未初始化,則結果是不肯定的。對於 Solaris 線程,請參見。thread

若是缺省的讀寫鎖屬性適用,則 PTHREAD_RWLOCK_INITIALIZER 宏可初始化以靜態方式分配的讀寫鎖,其做用與經過調用 pthread_rwlock_init() 並將參數 attr 指定爲 NULL 進行動態初始化等效,區別在於不會執行錯誤檢查。配置

若是成功,pthread_rwlock_init() 會返回零。不然,將返回用於指明錯誤的錯誤號。引用

若是 pthread_rwlock_init() 失敗,將不會初始化 rwlock,而且 rwlock 的內容是不肯定的。程序

描述:

attr 或 rwlock 指定的值無效。

獲取讀寫鎖中的讀鎖

可用來向 rwlock 所引用的讀寫鎖應用讀鎖。

#include <pthread.h> int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock );

如 果寫入器未持有讀鎖,而且沒有任何寫入器基於該鎖阻塞,則調用線程會獲取讀鎖。若是寫入器未持有讀鎖,但有多個寫入器正在等待該鎖時,調用線程是否能獲取 該鎖是不肯定的。若是某個寫入器持有讀鎖,則調用線程沒法獲取該鎖。若是調用線程未獲取讀鎖,則它將阻塞。調用線程必須獲取該鎖以後,才能從 pthread_rwlock_rdlock() 返回。若是在進行調用時,調用線程持有 rwlock 中的寫鎖,則結果是不肯定的。

爲避免寫入器資源匱乏,容許在多個實現中使寫入器的優先級高於讀取器。例如,Solaris 線程實現中寫入器的優先級高於讀取器。 請參見。

一個線程能夠在 rwlock 中持有多個併發的讀鎖,該線程能夠成功調用 pthread_rwlock_rdlock() n 次。該線程必須調用 pthread_rwlock_unlock() n 次才能執行匹配的解除鎖定操做。

若是針對未初始化的讀寫鎖調用 pthread_rwlock_rdlock(),則結果是不肯定的。

線程信號處理程序能夠處理傳送給等待讀寫鎖的線程的信號。從信號處理程序返回後,線程將繼續等待讀寫鎖以執行讀取,就好像線程未中斷同樣。

若是成功,pthread_rwlock_rdlock() 會返回零。不然,將返回用於指明錯誤的錯誤號。

描述:

attr 或 rwlock 指定的值無效。

讀取非阻塞讀寫鎖中的鎖

應用讀鎖的方式與 pthread_rwlock_rdlock() 相似,區別在於若是任何線程持有 rwlock 中的寫鎖或者寫入器基於 rwlock 阻塞,則 pthread_rwlock_tryrdlock() 函數會失敗。對於 Solaris 線程,請參見。

#include <pthread.h> int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);

若是獲取了用於在 rwlock 所引用的讀寫鎖對象中執行讀取的鎖,則 pthread_rwlock_tryrdlock() 將返回零。若是沒有獲取該鎖,則返回用於指明錯誤的錯誤號。

描述:

沒法獲取讀寫鎖以執行讀取,由於寫入器持有該鎖或者基於該鎖已阻塞。

寫入讀寫鎖中的鎖

可用來向 rwlock 所引用的讀寫鎖應用寫鎖。

#include <pthread.h> int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock );

若是沒有其餘讀取器線程或寫入器線程持有讀寫鎖 rwlock,則調用線程將獲取寫鎖。不然,調用線程將阻塞。調用線程必須獲取該鎖以後,才能從 pthread_rwlock_wrlock() 調用返回。若是在進行調用時,調用線程持有讀寫鎖(讀鎖或寫鎖),則結果是不肯定的。

爲避免寫入器資源匱乏,容許在多個實現中使寫入器的優先級高於讀取器。(例如,Solaris 線程實現容許寫入器的優先級高於讀取器。請參見。)

若是針對未初始化的讀寫鎖調用 pthread_rwlock_wrlock(),則結果是不肯定的。

線程信號處理程序能夠處理傳送給等待讀寫鎖以執行寫入的線程的信號。從信號處理程序返回後,線程將繼續等待讀寫鎖以執行寫入,就好像線程未中斷同樣。

若是獲取了用於在 rwlock 所引用的讀寫鎖對象中執行寫入的鎖,則 pthread_rwlock_rwlock() 將返回零。若是沒有獲取該鎖,則返回用於指明錯誤的錯誤號。

寫入非阻塞讀寫鎖中的鎖

應用寫鎖的方式與 pthread_rwlock_wrlock() 相似,區別在於若是任何線程當前持有用於讀取和寫入的 rwlock,則 pthread_rwlock_trywrlock() 函數會失敗。對於 Solaris 線程,請參見 。

#include <pthread.h> int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);

若是針對未初始化的讀寫鎖調用 pthread_rwlock_trywrlock(),則結果是不肯定的。

線程信號處理程序能夠處理傳送給等待讀寫鎖以執行寫入的線程的信號。從信號處理程序返回後,線程將繼續等待讀寫鎖以執行寫入,就好像線程未中斷同樣。

若是獲取了用於在 rwlock 引用的讀寫鎖對象中執行寫入的鎖,則 pthread_rwlock_trywrlock() 將返回零。不然,將返回用於指明錯誤的錯誤號。

描述:

沒法爲寫入獲取讀寫鎖,由於已爲讀取或寫入鎖定該讀寫鎖。

解除鎖定讀寫鎖

可用來釋放在 rwlock 引用的讀寫鎖對象中持有的鎖。

#include <pthread.h> int pthread_rwlock_unlock (pthread_rwlock_t *rwlock);

若是調用線程未持有讀寫鎖 rwlock,則結果是不肯定的。對於 Solaris 線程,請參見。

若是經過調用 pthread_rwlock_unlock() 來釋放讀寫鎖對象中的讀鎖,而且其餘讀鎖當前由該鎖對象持有,則該對象會保持讀取鎖定狀態。若是 pthread_rwlock_unlock() 釋放了調用線程在該讀寫鎖對象中的最後一個讀鎖,則調用線程再也不是該對象的屬主。若是 pthread_rwlock_unlock() 釋放了該讀寫鎖對象的最後一個讀鎖,則該讀寫鎖對象將處於無屬主、解除鎖定狀態。

若是經過調用 pthread_rwlock_unlock() 釋放了該讀寫鎖對象的最後一個寫鎖,則該讀寫鎖對象將處於無屬主、解除鎖定狀態。

若是 pthread_rwlock_unlock() 解除鎖定該讀寫鎖對象,而且多個線程正在等待獲取該對象以執行寫入,則經過調度策略可肯定獲取該對象以執行寫入的線程。若是多個線程正在等待獲取讀寫鎖對象以執行讀取,則經過調度策略可肯定等待線程獲取該對象以執行寫入的順序。若是多個線程基於 rwlock 中的讀鎖和寫鎖阻塞,則沒法肯定讀取器和寫入器誰先得到該鎖。

若是針對未初始化的讀寫鎖調用 pthread_rwlock_unlock(),則結果是不肯定的。

若是成功,pthread_rwlock_unlock() 會返回零。不然,將返回用於指明錯誤的錯誤號。

銷燬讀寫鎖

可用來銷燬 rwlock 引用的讀寫鎖對象並釋放該鎖使用的任何資源。

#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 線程,請參見。

若是成功,pthread_rwlock_destroy() 會返回零。不然,將返回用於指明錯誤的錯誤號。

描述:

attr 或 rwlock 指定的值無效。

相關文章
相關標籤/搜索