執行緒讀寫鎖總結

2021-07-22 12:01:56 字數 2516 閱讀 4854

概括:pthread_wrlock 執行緒讀寫鎖用於多執行緒的非同步控制,主要是用於併發控制;

主要介面函式

介面名入參

出參備註

int pthread_rwlock_rdlock

鎖控制代碼指標

執行結果

讀加鎖int pthread_rwlock_wrlock

鎖控制代碼指標

執行結果

寫加鎖int pthread_rwlock_unlock

鎖控制代碼指標

執行結果

解鎖int pthread_rwlock_tryrdlock

鎖控制代碼執行結果

嘗試獲取讀鎖

int pthread_rwlock_trywrlock

鎖控制代碼指標

執行結果

嘗試獲取寫鎖

int pthread_rwlock_init

鎖控制代碼執行結果

預設鎖初始化,也可以使用巨集直接賦值(pthread_rwlock_initializer)

int pthread_rwlock_destroy

鎖控制代碼執行結果

銷毀**鎖資源

通常情況**示例:

pthread_rwlock_t rwlock = pthread_rwlock_initializer;

void * func_1(void *arg)

}int main(void)

for (i = 0; i < ipthreadnum; i++)

}

一把寫鎖和多把讀鎖的關係;

讀鎖在開門的時候需要看看寫鎖是否插入如果當前寫鎖在用著,需要阻塞;如果沒有寫鎖在,多把讀鎖都可以獲取;

如果要獲取寫鎖,就要看看當前有沒有寫鎖,如果有,將阻塞直到釋放;如果沒有,那麼看看是否有讀鎖在,如果有,那麼依舊等待阻塞;等讀鎖釋放之後,再獲取寫鎖;

.h>

typedef

union

__data;

# else

struct

__data;

# endif

char __size[__sizeof_pthread_rwlock_t];

long

int __align;

} pthread_rwlock_t;

void * func_1(void *arg)

pthread_rwlock_unlock(&rwlock);

puts("hi, i free rdlock again");

printf ("reader:%d\n", rwlock.__data.__nr_readers);

}void * func_2(void *arg)

}

root@desktop:pthreadlock# ./main -lpthread

hi, i get rdlock

reader:1

hi, i free rdlock

reader:0

hi, i free rdlock again <--- 錯誤釋放鎖

reader:-1

<--- 讀鎖使用者異常

^c<-- 獲取寫鎖錯誤阻塞

如果當前執行緒已經加了寫鎖,然後再加上讀鎖會如何:

pthread_rwlock_t rwl;

cout

<< "init: "

<< pthread_rwlock_init(&rwl, null) << endl;

cout

<< "wrlock: "

<< pthread_rwlock_wrlock(&rwl) << endl;

cout

<< "rdlock: "

<< pthread_rwlock_rdlock(&rwl) << endl;

cout

<< "unlock: "

<< pthread_rwlock_unlock(&rwl) << endl;

cout

<< "unlock: "

<< pthread_rwlock_unlock(&rwl) << endl;

cout

<< "wrlock: "

<< pthread_rwlock_wrlock(&rwl) << endl; // dead!

cout

<< "unlock: "

<< pthread_rwlock_unlock(&rwl) << endl;

輸出為:

init: 0

wrlock: 0

rdlock: 35

//#define edeadlk 35 /* resource deadlock would occur */

unlock: 0

unlock: 0

結論:需要判斷加鎖返回值,確保加鎖解鎖安全;

參考:

Linux執行緒同步 讀寫鎖

讀寫鎖和互斥量 互斥鎖 很類似,是另一種執行緒同步機制,但不屬於posix標準,可以用來同步同一程序中的各個執行緒。當然如果乙個讀寫鎖存放在多個程序共享的某個記憶體區中,那麼還可以用來進行程序間的同步.和互斥量不同的是 互斥量會把試圖進入已保護的臨界區的執行緒都阻塞 然而讀寫鎖會視當前進入臨界區的執...

linux程式設計 執行緒 讀寫鎖

讀寫鎖通訊機制 讀寫鎖分為讀鎖和寫鎖,功能如下 1 如果某執行緒申請了讀鎖,其他執行緒可以再申請讀鎖,但不能申請寫鎖。2 如果某執行緒申請了寫鎖,則其他執行緒不能申請讀鎖,也不能申請寫鎖。初始化讀寫鎖 int pthread rwlock init pthread rwlock t restrict...

多執行緒學習 讀寫鎖

讀寫鎖 reentrantreadwritelock 具有互斥排他效果,即同一時間只有乙個執行緒在執行鎖後面的任務,這種效率比較搞。讀鎖也稱為共享鎖,寫鎖也稱為排他鎖。多個讀鎖之間不互斥,讀鎖與寫鎖互斥,寫鎖與寫鎖互斥。在沒有執行緒thread進行寫入操作時,進行讀取操作的多個執行緒都可以獲取讀鎖,...