日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【C/C++多线程编程之九】pthread读写锁

發布時間:2025/3/15 c/c++ 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C/C++多线程编程之九】pthread读写锁 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

多線程編程之讀寫鎖

? ? ?Pthread POSIX threads 的簡稱,是POSIX線程標準

? ? ? ??pthread讀寫鎖把對共享資源的訪問者分為讀者寫者,讀者只對共享資源進行讀訪問,寫者只對共享資源進行寫操作。在互斥機制,讀者和寫者都需要獨立獨占互斥量以獨占共享資源,在讀寫鎖機制下,允許同時有多個讀者讀訪問共享資源,只有寫者才需要獨占資源。相比互斥機制,讀寫機制由于允許多個讀者同時讀訪問共享資源,進一步提高了多線程的并發度。

? ? ? ? ?

? ? ? ?1.讀寫鎖機制

? ? ? ?寫者:寫者使用寫鎖,如果當前沒有讀者,也沒有其他寫者,寫者立即獲得寫鎖;否則寫者將等待,直到沒有讀者和寫者。

? ? ? ?讀者:讀者使用讀鎖,如果當前沒有寫者,讀者立即獲得讀鎖;否則讀者等待,直到沒有寫者。

? ? ? ? ? ?

? ? ? ? ??2.讀寫鎖特性

? ? ? ? 同一時刻只有一個線程可以獲得寫鎖,同一時刻可以有多個線程獲得讀鎖。

? ? ? ? 讀寫鎖處于寫鎖狀態時,所有試圖對讀寫鎖加鎖的線程,不管是讀者試圖加讀鎖,還是寫者試圖加寫鎖,都會被阻塞。

? ? ? ?讀寫鎖處于讀鎖狀態時,有寫者試圖加寫鎖時,之后的其他線程的讀鎖請求會被阻塞,以避免寫者長時間的不寫鎖。

? ? ? ??

? ? ? ??3.讀寫鎖基本函數

? ? ? ? ?# include<pthread.h>

讀寫鎖初始化:

? ? ? ??int?pthread_rwlock_init(pthread_rwlock_t * rwlock,?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?const pthread_rwlockattr_t * ?attr);

? ? ? ? 該函數第一個參數為讀寫鎖指針,第二個參數為讀寫鎖屬性指針。函數按讀寫鎖屬性對讀寫鎖進行初始化。

加讀鎖:

? ? ? ??int?pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);

? ? ? ? 該函數參數為讀寫鎖指針。函數用于對讀寫鎖加讀鎖。

加寫鎖:

? ? ? ??int?pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);

? ? ? ? 該函數參數為讀寫鎖指針。函數用于對讀寫鎖加寫鎖。

釋放讀寫鎖:

? ? ? ??int?pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

? ? ? ? 該函數參數為讀寫鎖指針。函數用于釋放讀寫鎖,包括讀鎖與寫鎖。

銷毀讀寫鎖:

? ? ? ??int?pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

? ? ? ? 該函數參數為讀寫鎖指針。函數用于銷毀讀寫鎖。

? ? ? ??4.牛刀小試

? ? ? ? 示例使用讀寫鎖,對共享資源data進行讀寫同步,線程readerMreaderN為讀者線程,線程writerAwriterB為寫者線程。 ? ? ??

?

?

?

#include "pthread.h"

#include "sched.h"

#include "semaphore.h"

#include "windows.h"

#include "stdio.h"

?

#pragma comment(lib, "pthreadVC2.lib")???? //必須加上這句

?

pthread_t t1;?????????? //pthread_t變量t1,用于獲取線程1的ID

pthread_t t2;?????????? //pthread_t變量t2,用于獲取線程2的ID

?

pthread_rwlock_t rwlock;???????????? //聲明讀寫鎖

?

int data=1;????????????????????????? //共享資源

?

void* readerM(void* arg)

{

while(1)

{

pthread_rwlock_rdlock(&rwlock);??? //讀者加讀鎖

?

printf("M 讀者讀出: %d \n",data);?? //讀取共享資源

?

pthread_rwlock_unlock(&rwlock);??? //讀者釋放讀鎖

?

Sleep(1200);

}

return NULL;

}

?

void* readerN(void* arg)

{

while(1)

{

pthread_rwlock_rdlock(&rwlock);

?

printf(" N讀者讀出: %d \n",data);

?

pthread_rwlock_unlock(&rwlock);

?

Sleep(700);

}

return NULL;

}

?

void* writerA(void* arg)

{

while(1)

{

pthread_rwlock_wrlock(&rwlock);????? //寫者加寫鎖

?

data++;????????????????????????????? //對共享資源寫數據

printf("????????A寫者寫入: %d\n",data);

?

pthread_rwlock_unlock(&rwlock);????? //釋放寫鎖

?

Sleep(2000);

}

return NULL;

}

?

void* writerB(void* arg)

{

while(1)

{

pthread_rwlock_wrlock(&rwlock);

?

?data++;

printf("????????B寫者寫入: %d\n",data);

?

pthread_rwlock_unlock(&rwlock);

?

Sleep(2000);

}

return NULL;

}

?

void main(int argc,char** argv)

{

pthread_rwlock_init(&rwlock, NULL);?? //初始化讀寫鎖

???

??? pthread_create(&t1,NULL,readerM,NULL);

pthread_create(&t1,NULL,readerN,NULL);

pthread_create(&t2,NULL,writerA,NULL);

pthread_create(&t2,NULL,writerB,NULL);

?

pthread_rwlock_destroy(&rwlock);????? //銷毀讀寫鎖

?

Sleep(10000000);

return;

}

?

result:

?

來自 <https://blog.csdn.net/lovecodeless/article/details/24968369>

總結

以上是生活随笔為你收集整理的【C/C++多线程编程之九】pthread读写锁的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。