linux线程间同步(1)读写锁
生活随笔
收集整理的這篇文章主要介紹了
linux线程间同步(1)读写锁
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
讀寫鎖比mutex有更高的適用性,可以多個線程同時占用讀模式的讀寫鎖,但是只能一個線程占用寫模式的讀寫鎖。
1. 當讀寫鎖是寫加鎖狀態時,在這個鎖被解鎖之前,所有試圖對這個鎖加鎖的線程都會被阻塞;
2. 當讀寫鎖在讀加鎖狀態時,所有試圖以讀模式對它進行加鎖的線程都可以得到訪問權,但是以寫模式對它進行枷鎖的線程將阻塞;
3. 當讀寫鎖在讀模式鎖狀態時,如果有另外線程試圖以寫模式加鎖,讀寫鎖通常會阻塞隨后的讀模式鎖請求,這樣可以避免讀模式鎖長期占用,而等待的寫模式鎖請求長期阻塞;
這種鎖適用對數據結構進行讀的次數比寫的次數多的情況下,因為可以進行讀鎖共享。
API接口說明:
1) 初始化和銷毀
#include <pthread.h> int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr); int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);成功則返回0, 出錯則返回錯誤編號.
2) 讀加鎖和寫加鎖
獲取鎖的兩個函數是阻塞操作
成功則返回0, 出錯則返回錯誤編號.
3) 非阻塞獲得讀鎖和寫鎖
非阻塞的獲取鎖操作, 如果可以獲取則返回0, 否則返回錯誤的EBUSY.
成功則返回0, 出錯則返回錯誤編號.
實例代碼
/************************************************************** pthread_rwlock_test2.c:驗證讀寫鎖的默認順序* 如果在main函數中用pthread_rwlock_wrlock上鎖,那么* 如果所有線程都阻塞在寫鎖上的時候,優先處理的是被阻塞的寫鎖* 然后才處理讀出鎖* 如果在main函數中用pthread_rwlock_rdlock上鎖,那么* 如果有讀者正在讀的時候即使后面到來的寫者比另外一些到來的讀者更早* 也是先處理完讀者,才轉而處理寫者,這樣會導致寫饑餓* * 由此(執行結果)可以看出,LINUX平臺默認的是讀者優先,如果想要以寫者優先* 則需要做一些處理**************************************************************/ #include <stdio.h> #include <pthread.h> #include <stdlib.h>pthread_rwlock_t rwlock;void *readers(void *arg) {pthread_rwlock_rdlock(&rwlock);printf("reader %d got the lock\n", (int)arg);pthread_rwlock_unlock(&rwlock);//return NULL; } void *writers(void *arg) {pthread_rwlock_wrlock(&rwlock);printf("writer %d got the lock\n", (int)arg);pthread_rwlock_unlock(&rwlock);//return NULL; }int main(int argc, char **argv) {int retval, i;pthread_t writer_id, reader_id;pthread_attr_t attr;int nreadercount = 1, nwritercount = 1;if (argc != 2) {fprintf(stderr, "usage, <%s threadcount>", argv[0]);return -1;}retval = pthread_rwlock_init(&rwlock, NULL);if (retval) {fprintf(stderr, "init lock failed\n");return retval;}pthread_attr_init(&attr);//pthread_attr_setdetachstate用來設置線程的分離狀態//也就是說一個線程怎么樣終止自己,狀態設置為PTHREAD_CREATE_DETACHED//表示以分離狀態啟動線程pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);//分別在main函數中對讀出者和寫入者加鎖,得到的處理結果是不一樣的pthread_rwlock_wrlock(&rwlock); // pthread_rwlock_rdlock(&rwlock);for (i = 0; i < atoi(argv[1]); i++) {if (random() % 2) {pthread_create(&reader_id, &attr, readers, (void *)nreadercount);printf("create reader %d\n", nreadercount++);} else {pthread_create(&writer_id, &attr, writers, (void *)nwritercount);printf("create writer %d\n", nwritercount++);}}printf("main unlock\n");pthread_rwlock_unlock(&rwlock);sleep(5);//sleep是為了等待另外的線程的執行return 0; }參考:
- LINUX_IPC
總結
以上是生活随笔為你收集整理的linux线程间同步(1)读写锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mybatis动态sql的使用
- 下一篇: Linux SO_KEEPALIVE属性