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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

信号量 读者写者问题

發(fā)布時間:2024/9/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 信号量 读者写者问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
寫了兩個小程序驗證 1?/*
?2??*???讀者寫者問題,讀者優(yōu)先
?3??*???<<操作系統(tǒng)-內(nèi)核與設(shè)計原理>>?p183,p184
?4??*???有讀者在讀那么后來的讀者就可以繼續(xù)讀,而已經(jīng)在等待的寫者繼續(xù)等待,
?5??*???直到某個時刻沒有任何讀者。
?6??*???讀者之間不互斥,寫者之間互斥,只能一個寫,可以多個讀,
?7??*???讀者寫者之間互斥,有寫者寫則不能有讀者讀
?8??*???所以只需要當(dāng)前第一個讀者和寫者競爭,競爭成功則后面的讀者因為
?9??*???已經(jīng)有讀者在讀,可以直接讀。
10??*/
11?#include??<stdio.h>
12?#include??<pthread.h>
13?#include??<ctype.h>
14?#include?<semaphore.h>
15?
16?static?sem_t?sem_x;??//保證readcount被正確更新
17?static?sem_t?sem_wsem;?//保證讀寫,寫寫互斥
18?static?int?readcount?=?0;
19?void?*write(void?*a)?
20?{
21?????sem_wait(&sem_wsem);
22?????
23?????//writting
24?????printf("Writer?is?writting?no?reader?allowed\n");
25?????sleep(2);
26?????printf("Finished?writting\n");
27?????//end?of?writting
28?
29?????sem_post(&sem_wsem);
30?}
31?
32?void?*read(void?*a)?
33?{
34?????int?*p?=?(int?*)a;
35?????int?tid?=?*p?+?1;
36?????int?i;
37?????for?(i?=?0;?i?<?2;?i++)?{
38?????????sem_wait(&sem_x);
39?????????readcount++;
40?????????printf("Reader?count?is?%d\n",?readcount);
41?????????if?(readcount?==?1)
42?????????????sem_wait(&sem_wsem);
43?????????sem_post(&sem_x);
44?
45?????????//reading
46?????????printf("Reader?%d?is?reading\n",?tid);
47?????????sleep(2);
48?????????printf("Finshed?reading\n");
49?
50?????????sem_wait(&sem_x);
51?????????readcount--;
52?????????if?(readcount?==?0)
53?????????????sem_post(&sem_wsem);
54?????????sem_post(&sem_x);
55?????}
56?}
57?
58?int?main(int?argc,?char?*argv[])
59?{
60?????pthread_t?reader_tid[20];
61?????pthread_t?writer_tid[10];
62?????
63?????//init?semaphore
64?????if(sem_init(&sem_x,0,?1)?==?-1?||
65????????sem_init(&sem_wsem,?0,?1)?==?-1)?{
66?????????printf("Failed?to?init?semaphore!\n");
67?????????exit(1);
68?????}
69?
70?????int?i;
71?????for?(i?=?0;?i?<?10;?i++)
72?????????pthread_create(&reader_tid[i],?NULL,?read,(void?*)?&i);
73?????for?(i?=?0;?i?<?5;?i++)
74?????????pthread_create(&writer_tid[i],?NULL,?write,?(void?*)?&i);
75?????for?(i?=?10;?i?<?20;?i++)
76?????????pthread_create(&reader_tid[i],?NULL,?read,(void?*)?&i);
77?????for?(i?=?5;?i?<?10;?i++)
78?????????pthread_create(&writer_tid[i],?NULL,?write,(void?*)?&i);
79?
80?????for?(i?=?0;?i?<?20;?i++)
81?????????pthread_join(reader_tid[i],?NULL);
82?????for?(i?=?0;?i?<?10;?i++)
83?????????pthread_join(writer_tid[i],?NULL);
84?
85?????printf("Final?read?count?is?%d\n",?readcount);
86?????return?0;
87?} //test Reader count is 1 Reader 1 is reading Reader count is 2 Reader 2 is reading Reader count is 3 Reader 3 is reading Reader count is 4 Reader 4 is reading Reader count is 5 Reader 5 is reading Reader count is 6 Reader 6 is reading Reader count is 7 Reader 7 is reading Reader count is 8 Reader 8 is reading Reader count is 9 Reader 9 is reading Reader count is 10 Reader 10 is reading Reader count is 11 Reader 11 is reading Reader count is 12 Reader 12 is reading Reader count is 13 Reader 13 is reading Reader count is 14 Reader 14 is reading Reader count is 15 Reader 15 is reading Reader count is 16 Reader 16 is reading Reader count is 17 Reader 17 is reading Reader count is 18 Reader 18 is reading Reader count is 19 Reader 19 is reading Reader count is 20 Reader 20 is reading Finshed reading Reader count is 20 Reader 1 is reading Finshed reading Reader count is 20 Reader 2 is reading Finshed reading Reader count is 20 Reader 3 is reading Finshed reading Reader count is 20 Reader 4 is reading Finshed reading Reader count is 20 Reader 5 is reading Finshed reading Reader count is 20 Reader 6 is reading Finshed reading Reader count is 20 Reader 7 is reading Finshed reading Reader count is 20 Reader 8 is reading Finshed reading Reader count is 20 Reader 9 is reading Finshed reading Reader count is 20 Reader 10 is reading Finshed reading Reader count is 20 Reader 11 is reading Finshed reading Reader count is 20 Reader 12 is reading Finshed reading Reader count is 20 Reader 13 is reading Finshed reading Reader count is 20 Reader 14 is reading Finshed reading Reader count is 20 Reader 15 is reading Finshed reading Reader count is 20 Reader 16 is reading Finshed reading Reader count is 20 Reader 17 is reading Finshed reading Reader count is 20 Reader 18 is reading Finshed reading Reader count is 20 Reader 19 is reading Finshed reading Reader count is 20 Reader 20 is reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Writer is writting no reader allowed Finished writting Writer is writting no reader allowed Finished writting Writer is writting no reader allowed Finished writting Writer is writting no reader allowed Finished writting Writer is writting no reader allowed Finished writting Writer is writting no reader allowed Finished writting Writer is writting no reader allowed Finished writting Writer is writting no reader allowed Finished writting Writer is writting no reader allowed Finished writting Writer is writting no reader allowed Finished writting Final read count is 0


??1?/*
??2??*???讀者寫者問題,寫者優(yōu)先
??3??*???<<操作系統(tǒng)-內(nèi)核與設(shè)計原理>>?p185,p16
??4??*??當(dāng)寫者出現(xiàn)后,后來的讀者會被阻塞,直到?jīng)]有寫者。
??5??*??
??6??*??第一個讀者和寫者競爭,如果失敗了,證明有寫者
??7??*??后來的讀者將在另一個信號量上排隊。
??8??*??
??9??*??在rsem不允許建立讀者長隊列,否則當(dāng)同時有很多讀進(jìn)程
?10??*??和第一個寫者出現(xiàn),可能寫者會在rsem的競爭中排在后面
?11??*??不能跳過前面的讀者。保證了第一寫者writecount=1的優(yōu)先地位,
?12??*??但是實驗一般測不出來,有沒有sem_z一樣的,因為,讀者在rsem
?13??*??上排隊的時間太短了,比如writecount?==?0了?singnal?rsem
?14??*??然后很快的所有排隊的讀者就都獲得了讀的權(quán)利,隊列變空。除非實驗?zāi)軌?br />?15??*??在這個時候出先一個寫者,這樣有sem_z則寫者至多讓前面的一個讀者讀,
?16??*??就取得了寫權(quán)利,
?17??*??而沒有的話,rsem對了寫者前面的都會去讀,意義不大。
?18??*??if?(writecount?==?1)????
?19?????????sem_wait(&sem_rsem);
?20?????確保了后續(xù)寫者相對讀者的優(yōu)先地位.這個是主要的寫者優(yōu)勢。
?21??*/
?22?#include??<stdio.h>
?23?#include??<pthread.h>
?24?#include??<ctype.h>
?25?#include?<semaphore.h>
?26?
?27?static?sem_t?sem_x;?????//保證readcount被正確更新
?28?static?sem_t?sem_y;?????//保證writercount被正確更新
?29?static?sem_t?sem_z;?????//競爭rsem失敗后,后續(xù)讀者在此排隊
?30?static?sem_t?sem_wsem;??//保證讀寫,寫寫互斥
?31?static?sem_t?sem_rsem;??//當(dāng)一個寫者出現(xiàn),用于禁止所有的讀進(jìn)程
?32?static?int?readcount?=?0;
?33?static?int?writecount?=?0;
?34?void?*write(void?*a)?
?35?{
?36?????int?*p?=?(int?*)a;
?37?????int?tid?=?*p?+?1;
?38?????sem_wait(&sem_y);
?39?????writecount++;
?40?????printf("Writter?count?is?%d\n",?writecount);
?41?????if?(writecount?==?1)????//寫者在rsem的競爭中優(yōu)先
?42?????????sem_wait(&sem_rsem);
?43?????sem_post(&sem_y);
?44?????
?45?????sem_wait(&sem_wsem);
?46?
?47?????//writting
?48?????printf("Writer?%d?is?writting?no?reader?allowed\n",?tid);
?49?????sleep(2);
?50?????printf("Finished?writting\n");
?51?????//end?of?writting
?52?
?53?????sem_post(&sem_wsem);
?54?
?55?????sem_wait(&sem_y);
?56?????writecount--;
?57?????if?(writecount?==?0)
?58?????????sem_post(&sem_rsem);
?59?????sem_post(&sem_y);
?60?}
?61?
?62?void?*read(void?*a)?
?63?{
?64?????int?*p?=?(int?*)a;
?65?????int?tid?=?*p?+?1;
?66?????int?i;
?67?????for?(i?=?0;?i?<?2;?i++)?{
?68?????????sem_wait(&sem_z);
?69?????????sem_wait(&sem_rsem);
?70?????????sem_wait(&sem_x);
?71?????????readcount++;
?72?????????printf("Reader?count?is?%d\n",?readcount);
?73?????????if?(readcount?==?1)
?74?????????????sem_wait(&sem_wsem);
?75?????????sem_post(&sem_x);
?76?????????sem_post(&sem_rsem);
?77?????????sem_post(&sem_z);
?78?
?79?????????//reading
?80?????????printf("Reader?%d?is?reading\n",?tid);
?81?????????sleep(2);
?82?????????printf("Finshed?reading\n");
?83?????????//end?of?reading
?84?
?85?????????sem_wait(&sem_x);
?86?????????readcount--;
?87?????????if?(readcount?==?0)
?88?????????????sem_post(&sem_wsem);
?89?????????sem_post(&sem_x);
?90?????}
?91?}
?92?
?93?int?main(int?argc,?char?*argv[])
?94?{
?95?????pthread_t?reader_tid[20];
?96?????pthread_t?writer_tid[10];
?97?????
?98?????//init?semaphore
?99?????if(sem_init(&sem_x,0,?1)?==?-1?||
100????????sem_init(&sem_y,0,?1)?==?-1?||
101????????sem_init(&sem_z,0,?1)?==?-1?||
102????????sem_init(&sem_wsem,?0,?1)?==?-1?||
103????????sem_init(&sem_rsem,?0,?1)?==?-1)?{
104?????????printf("Failed?to?init?semaphore!\n");
105?????????exit(1);
106?????}
107?
108?????int?i;
109?????for?(i?=?0;?i?<?10;?i++)
110?????????pthread_create(&reader_tid[i],?NULL,?read,(void?*)?&i);
111?????for?(i?=?0;?i?<?5;?i++)
112?????????pthread_create(&writer_tid[i],?NULL,?write,?(void?*)?&i);
113?????for?(i?=?10;?i?<?20;?i++)
114?????????pthread_create(&reader_tid[i],?NULL,?read,(void?*)?&i);
115?????for?(i?=?5;?i?<?10;?i++)
116?????????pthread_create(&writer_tid[i],?NULL,?write,(void?*)?&i);
117?
118?????for?(i?=?0;?i?<?20;?i++)
119?????????pthread_join(reader_tid[i],?NULL);
120?????for?(i?=?0;?i?<?10;?i++)
121?????????pthread_join(writer_tid[i],?NULL);
122?
123?????return?0;
124?} //test Reader count is 1 Reader 1 is reading Reader count is 2 Reader 2 is reading Reader count is 3 Reader 3 is reading Reader count is 4 Reader 4 is reading Reader count is 5 Reader 5 is reading Reader count is 6 Reader 6 is reading Reader count is 7 Reader 7 is reading Reader count is 8 Reader 8 is reading Reader count is 9 Reader 9 is reading Reader count is 10 Reader 10 is reading Writter count is 1 Writter count is 2 Writter count is 3 Writter count is 4 Writter count is 5 Writter count is 6 Writter count is 7 Writter count is 8 Writter count is 9 Writter count is 10 Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Writer 1 is writting no reader allowed Finished writting Writer 2 is writting no reader allowed Finished writting Writer 3 is writting no reader allowed Finished writting Writer 4 is writting no reader allowed Finished writting Writer 5 is writting no reader allowed Finished writting Writer 6 is writting no reader allowed Finished writting Writer 7 is writting no reader allowed Finished writting Writer 8 is writting no reader allowed Finished writting Writer 9 is writting no reader allowed Finished writting Writer 10 is writting no reader allowed Finished writting Reader count is 1 Reader 11 is reading Reader count is 2 Reader 12 is reading Reader count is 3 Reader 13 is reading Reader count is 4 Reader 14 is reading Reader count is 5 Reader 15 is reading Reader count is 6 Reader 16 is reading Reader count is 7 Reader 17 is reading Reader count is 8 Reader 18 is reading Reader count is 9 Reader 19 is reading Reader count is 10 Reader 20 is reading Reader count is 11 Reader 1 is reading Reader count is 12 Reader 2 is reading Reader count is 13 Reader 3 is reading Reader count is 14 Reader 4 is reading Reader count is 15 Reader 5 is reading Reader count is 16 Reader 6 is reading Reader count is 17 Reader 7 is reading Reader count is 18 Reader 8 is reading Reader count is 19 Reader 9 is reading Reader count is 20 Reader 10 is reading Finshed reading Reader count is 20 Reader 11 is reading Finshed reading Reader count is 20 Reader 12 is reading Finshed reading Reader count is 20 Reader 13 is reading Finshed reading Reader count is 20 Reader 14 is reading Finshed reading Reader count is 20 Reader 15 is reading Finshed reading Reader count is 20 Reader 16 is reading Finshed reading Reader count is 20 Reader 17 is reading Finshed reading Reader count is 20 Reader 18 is reading Finshed reading Reader count is 20 Reader 19 is reading Finshed reading Reader count is 20 Reader 20 is reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading Finshed reading ?

總結(jié)

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

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