概述
互斥鎖把試圖進入我們稱之為臨界區的所有其他線程都阻塞住。該臨界區通常涉及對由這些線程共享一個或多個資料的通路或更新。讀寫鎖在擷取讀寫鎖用于讀某個資料和擷取讀寫鎖用于寫直接作差別。讀寫鎖的配置設定規則如下:
1、隻要沒有線程持有某個給定的讀寫鎖用于寫,那麼任意數目的線程可以持有該讀寫鎖用于讀。
2、僅當沒有線程持有某個給定的讀寫鎖用于讀或用于寫時,才能配置設定該讀寫鎖用于寫。
即隻要沒有線程在修改某個給定的資料,那麼任意數目的線程都可以擁有該資料的讀通路權。僅當沒有其他線程在讀或修改某個給定的資料時,目前線程才可以修改它。
這種對于某個給定資源的共享通路也稱為共享-獨占上鎖,因為擷取一個讀寫鎖用于讀稱為共享鎖,擷取一個讀寫鎖用于寫稱為獨占鎖。
擷取與釋放讀寫鎖
讀寫鎖的資料類型為pthread_rwlock_t。如果這個類型的某個變量是靜态配置設定的,則可通過給它賦常值PTHREAD_RWLOCK_INITIALIZER來初始化它。
pthread_rwlock_rdlock擷取一個讀出鎖,如果對應的讀寫鎖已由某個寫入者持有,那就阻塞調用線程。pthread_rwlock_wrlock擷取一個寫入鎖,如果對應的讀寫鎖已由另一個寫入者持有,或者已由一個或多個讀出者持有,那就阻塞調用線程。pthread_rwlock_unlock釋放一個讀出鎖或寫入鎖。
下面兩個函數嘗試擷取一個讀出鎖或寫入鎖,但如果該鎖不能馬上取得,那就傳回一個EBUSY錯誤,而不是調用線程投入睡眠。
讀寫鎖屬性
給靜态配置設定的讀寫鎖指派PTHREAD_RWLOCK_INITIALIZER來初始化它。讀寫鎖變量也可通過調用pthread_rwlock_init來動态地初始化。當當一個線程不再需要某個讀寫鎖時,可調用pthread_rwlock_destroy摧毀它。
初始化某個讀寫鎖時,如果attr是空指針,就使用預設屬性。要賦予它非預設的屬性,需要使用如下兩個函數:
資料類型為pthread_rwlockattr_t的某個屬性對象一旦初始化,就通過調用不同的函數來啟用或禁止特定屬性。目前定義了的唯一屬性是PTHREAD_PROCESS_SHARED,它指定相應的讀寫鎖将不同程序間共享,而不僅僅是在單個程序内的不同線程間共享。以下兩個函數分别擷取和設定這個屬性。
讀寫鎖的實作可參考《UNP2》P142