概括: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進行寫入操作時,進行讀取操作的多個執行緒都可以獲取讀鎖,...