pthread rwlock t 介面解析

2021-06-22 14:36:59 字數 1264 閱讀 7131

在使用的過程中,往往會有一些細節上的疑問,心中會有模稜兩可的地方,然後自己做了試驗,並記錄下來。

首先,我們先來看一下 pthread_rwlock_t 結構體的定義:

struct

__data;

# endif

char __size[__sizeof_pthread_rwlock_t];

long int __align;

} pthread_rwlock_t;

在多執行緒程式設計中,死鎖問題是比較難定位的一種,通過呼叫棧我們檢視此時的pthread_rwlock_t資訊,對我們定位問題的幫助是很大的。

我們通常關注的字段有:

1. __nr_readers,

2. __nr_readers_queued,

3. __nr_writers_queued,

4. __writer

那這四個字段,那當我們執行緒加鎖時,是怎麼反應並記錄到這個結構體中的呢?

1. 當我們使用pthread_rwlock_rdlock()獲取一次讀鎖時,__nr_readers欄位就會加一,注意,就算是同乙個執行緒,在已經獲得讀鎖的情況下,再去獲取讀鎖,__nr_readers欄位仍然會加一的,當我們呼叫pthread_rwlock_unlock()一次時,__nr_readers就會減一,如果我們重複加了讀鎖,必須重複呼叫pthread_rwlock_unlock()來使__nr_readers減一,否則其他執行緒再想獲取寫鎖時,是會阻塞的。

2.__writer記錄此時是誰占用著寫鎖,每乙個執行緒都會有用同的id號表示。

3.__nr_readers_queued和__nr_writers_queued欄位表示有多少執行緒正等待加鎖。這裡有一點值得注意的地方就是,當想要獲取讀鎖,但是發現__nr_writers_queued欄位不為0,可就是有別的執行緒在等待獲取寫鎖時,且該執行緒的優先順序高於或想同於自己的優先順序時,自己是無法或許讀鎖的,即使當前pthread_rwlock_t只是被加了讀鎖,但是有高優先順序的執行緒已經在等待加寫鎖,自己仍然阻塞,為什麼要這樣呢?如果不這樣,那讀鎖就會很有可能被一直佔著,想加寫鎖的被餓死的情況。

4. 如果自己已經獲取了一次讀鎖,但是卻錯誤的呼叫了兩次pthread_rwlock_unlock(),會出現什麼情況呢?自己在ubuntu上試了一下,__nr_readers變成了乙個很大的數,也就是0又減一了,造成以後的寫鎖可能再也獲取不了了!

5. 如果自己已經獲取了寫鎖,再去加讀鎖,pthread_rwlock_rdlock()是會返回出錯的。

6. 如果自己已經獲取了讀鎖,再去加寫鎖,會出現死鎖的。

讀寫鎖pthread rwlock t的使用

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

讀寫鎖pthread rwlock t的使用

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

IRelationalOperator 介面的應用

irelationaloperator介面用來確定兩個圖形之間存在的空間關係,空間關係型別包括包含 相交 相等 相接 不相交 重疊 內部等。irelationaloperator介面主要方法有以下8個 1 contains包含關係 包含關係只存在於以下6種情況 點包含點 線包含點 線包含線 面包含點...