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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多线程读写进程

發(fā)布時間:2024/9/30 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多线程读写进程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

注意這里為什么不用mutex,因為只能是對mutex加鎖的線程對其解鎖,其他線程不能解鎖

http://blog.csdn.net/caotiancool/article/details/374101

讀者優(yōu)先算法

設置兩個互斥信號量:rwmutex?用于寫者與其他讀者/寫者互斥的訪問共享數(shù)據(jù)
??????????????????? rmutex??用于讀者互斥的訪問讀者計數(shù)器readcount


var rwmutex, rmutex : semaphore := 1,1 ;
int readcount = 0;?
cobegin
? ? ? ?readeri begin ?// i=1,2,….
? ? ? ? ? ? ? P(rmutex);
? ? ? ? ? ? ? Readcount++;
? ? ? ? ? ? ? If (readcount == 1) P(rwmutex);//當有第一個讀者進入時,就對寫信號加鎖;則后續(xù)讀者,直接讀,不須判斷是否有寫進程
? ? ? ? ? ? ? V(rmutex);
? ? ? ? ? ? ? 讀數(shù)據(jù);
? ? ? ? ? ? ? P(rmutex);
? ? ? ? ? ? ? Readcount--;
? ? ? ? ? ? ? If (readcount == 0) V(rwmutex);//當最后一個讀者離開時,對寫信號解鎖
? ? ? ? ? ? ? V(rmutex);
? ? ? ?End
? ? ? ?Writerj begin // j = 1,2,….
? ? ? ? ? ? ? P(rwmutex);//只有當最后一個讀者離開后,才能寫
? ? ? ? ? ? ? 寫更新;
? ? ? ? ? ? ? V(rwmutex);
? ? ? ?End?
Coend?

寫者優(yōu)先:

條件:

1)多個讀者可以同時進行讀
2)寫者必須互斥(只允許一個寫者寫,也不能讀者寫者同時進行)
3)寫者優(yōu)先于讀者(一旦有寫者,則后續(xù)讀者必須等待,喚醒時優(yōu)先考慮寫者)

解1:如果讀者數(shù)是固定的,我們可采用下面的算法:

rwmutex:用于寫者與其他讀者/寫者互斥的訪問共享數(shù)據(jù)?
rmutex:?該信號量初始值設為10,表示最多允許10個讀者進程同時進行讀操作

var rwmutex, rmutex?:?semaphore := 1,10?;
cobegin
?????? readeri begin? // i=1,2,….
?????? ?????? P(rwmutex);? //讀者、寫者互斥
?????? ?????? P(rmutex);
?????? ?????? V(rwmutex); ?//?釋放讀寫互斥信號量,允許其它讀、寫進程訪問資源
?????? ???????讀數(shù)據(jù);
?????? ?????? V(rmutex);
?????? End?????? ??????

?????? Writerj begin // j = 1,2,….
?????? ?????? P(rwmutex);
?????? ?????? For (i=1;i<=10;i++) P(rmutex); //禁止新讀者,并等待已進入的讀者退出
?????? ???????寫更新;
?????? ?????? For (i=1;i<=10;i++) V(rmutex); //?恢復允許rmutex?值為10
?????? ?????? V(rwmutex);?
?????? End?
Coend

?

解2:如果讀者數(shù)不固定,采用下面的算法:

設置三個互斥信號量:rwmutex?用于寫者與其他讀者/寫者互斥的訪問共享數(shù)據(jù)
????? ?????? ?????? rmutex??用于讀者互斥的訪問讀者計數(shù)器readcount?????? ?????? ?????? ????????? ????????????????? ? nrmutex?用于寫者等待已進入讀者退出,所有讀者退出前互斥寫操作

var rwmutex, rmutex,nrmutex?:?semaphore := 1,1,1?;?
int readcount = 0;
cobegin
?????? readeri begin? // i=1,2,….
?????? ?????? P(rwmutex); // 寫進程優(yōu)先,一旦有寫的進程,就不再允許有讀的進程再加入了
?????? ?????? P(rmutex);
?????? ?????? Readcount++;
?????? ?????? If (readcount == 1) P(nrmutex); //有讀者進入,互斥寫操作//nrmutex用來判斷是否還有讀者
?????? ?????? V(rmutex);
?????? ?????? V(rwmutex); //?及時釋放讀寫互斥信號量,允許其它讀、寫進程申請資源
?????? ???????讀數(shù)據(jù);
?????? ?????? P(rmutex);
?????? ?????? Readcount--;
?????? ?????? If (readcount == 0) V(nrmutex); //所有讀者退出,允許寫更新
?????? ?????? V(rmutex);
?????? End

?????? Writerj begin // j = 1,2,….
?????? ?????? P(rwmutex);? //?互斥后續(xù)其它讀者、寫者
?????? ?????? P(nrmutex); ?//如有讀者正在讀,等待所有讀者讀完
?????? ???????寫更新;
?????? ?????? V(nrmutex); ??//允許后續(xù)新的第一個讀者進入后互斥寫操作?
?????? ?????? V(rwmutex);? //允許后續(xù)新讀者及其它寫者
?????? End?
Coend


//讀寫進程, 讀者優(yōu)先。即使有寫進程在等待,新進的讀進程也直接進入 //由讀進程控制w sem_t mutex = 1, w = 1; int count = 0;void reader() {while (1) {p(mutex);if (count == 0)p(w);++count;v(mutex);//reading....p(mutex);--count;if(count == 0)v(w);v(mutex);} }void writer() {while (1) {p(w);//writingv(w);} }//寫優(yōu)先只需要用寫線程控制讀的信號量r, 也就是在writer和reader的開始和結(jié)束添加pv操作 //在有寫進程等待時,就不會有新的讀進程進入 sem_t mutex = 1, w = 1, r = 1; int count = 0;void reader() {while (1) {p(r);p(mutex);if (count == 0)p(w);++count;v(mutex);v(r);//reading....p(mutex);--count;if(count == 0)v(w);v(mutex);} }void writer() {while (1) {p(r);p(w);//writingv(w);v(r);} }

總結(jié)

以上是生活随笔為你收集整理的多线程读写进程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。