信号量 读者写者问题
生活随笔
收集整理的這篇文章主要介紹了
信号量 读者写者问题
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
寫了兩個(gè)小程序驗(yàn)證 1?/*
?2??*???讀者寫者問題,讀者優(yōu)先
?3??*???<<操作系統(tǒng)-內(nèi)核與設(shè)計(jì)原理>>?p183,p184
?4??*???有讀者在讀那么后來的讀者就可以繼續(xù)讀,而已經(jīng)在等待的寫者繼續(xù)等待,
?5??*???直到某個(gè)時(shí)刻沒有任何讀者。
?6??*???讀者之間不互斥,寫者之間互斥,只能一個(gè)寫,可以多個(gè)讀,
?7??*???讀者寫者之間互斥,有寫者寫則不能有讀者讀
?8??*???所以只需要當(dāng)前第一個(gè)讀者和寫者競(jìng)爭(zhēng),競(jìng)爭(zhēng)成功則后面的讀者因?yàn)?br />?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è)計(jì)原理>>?p185,p16
??4??*??當(dāng)寫者出現(xiàn)后,后來的讀者會(huì)被阻塞,直到?jīng)]有寫者。
??5??*??
??6??*??第一個(gè)讀者和寫者競(jìng)爭(zhēng),如果失敗了,證明有寫者
??7??*??后來的讀者將在另一個(gè)信號(hào)量上排隊(duì)。
??8??*??
??9??*??在rsem不允許建立讀者長(zhǎng)隊(duì)列,否則當(dāng)同時(shí)有很多讀進(jìn)程
?10??*??和第一個(gè)寫者出現(xiàn),可能寫者會(huì)在rsem的競(jìng)爭(zhēng)中排在后面
?11??*??不能跳過前面的讀者。保證了第一寫者writecount=1的優(yōu)先地位,
?12??*??但是實(shí)驗(yàn)一般測(cè)不出來,有沒有sem_z一樣的,因?yàn)?#xff0c;讀者在rsem
?13??*??上排隊(duì)的時(shí)間太短了,比如writecount?==?0了?singnal?rsem
?14??*??然后很快的所有排隊(duì)的讀者就都獲得了讀的權(quán)利,隊(duì)列變空。除非實(shí)驗(yàn)?zāi)軌?br />?15??*??在這個(gè)時(shí)候出先一個(gè)寫者,這樣有sem_z則寫者至多讓前面的一個(gè)讀者讀,
?16??*??就取得了寫權(quán)利,
?17??*??而沒有的話,rsem對(duì)了寫者前面的都會(huì)去讀,意義不大。
?18??*??if?(writecount?==?1)????
?19?????????sem_wait(&sem_rsem);
?20?????確保了后續(xù)寫者相對(duì)讀者的優(yōu)先地位.這個(gè)是主要的寫者優(yōu)勢(shì)。
?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;?????//競(jìng)爭(zhēng)rsem失敗后,后續(xù)讀者在此排隊(duì)
?30?static?sem_t?sem_wsem;??//保證讀寫,寫寫互斥
?31?static?sem_t?sem_rsem;??//當(dāng)一個(gè)寫者出現(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的競(jìng)爭(zhēng)中優(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 ?
?2??*???讀者寫者問題,讀者優(yōu)先
?3??*???<<操作系統(tǒng)-內(nèi)核與設(shè)計(jì)原理>>?p183,p184
?4??*???有讀者在讀那么后來的讀者就可以繼續(xù)讀,而已經(jīng)在等待的寫者繼續(xù)等待,
?5??*???直到某個(gè)時(shí)刻沒有任何讀者。
?6??*???讀者之間不互斥,寫者之間互斥,只能一個(gè)寫,可以多個(gè)讀,
?7??*???讀者寫者之間互斥,有寫者寫則不能有讀者讀
?8??*???所以只需要當(dāng)前第一個(gè)讀者和寫者競(jìng)爭(zhēng),競(jìng)爭(zhēng)成功則后面的讀者因?yàn)?br />?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è)計(jì)原理>>?p185,p16
??4??*??當(dāng)寫者出現(xiàn)后,后來的讀者會(huì)被阻塞,直到?jīng)]有寫者。
??5??*??
??6??*??第一個(gè)讀者和寫者競(jìng)爭(zhēng),如果失敗了,證明有寫者
??7??*??后來的讀者將在另一個(gè)信號(hào)量上排隊(duì)。
??8??*??
??9??*??在rsem不允許建立讀者長(zhǎng)隊(duì)列,否則當(dāng)同時(shí)有很多讀進(jìn)程
?10??*??和第一個(gè)寫者出現(xiàn),可能寫者會(huì)在rsem的競(jìng)爭(zhēng)中排在后面
?11??*??不能跳過前面的讀者。保證了第一寫者writecount=1的優(yōu)先地位,
?12??*??但是實(shí)驗(yàn)一般測(cè)不出來,有沒有sem_z一樣的,因?yàn)?#xff0c;讀者在rsem
?13??*??上排隊(duì)的時(shí)間太短了,比如writecount?==?0了?singnal?rsem
?14??*??然后很快的所有排隊(duì)的讀者就都獲得了讀的權(quán)利,隊(duì)列變空。除非實(shí)驗(yàn)?zāi)軌?br />?15??*??在這個(gè)時(shí)候出先一個(gè)寫者,這樣有sem_z則寫者至多讓前面的一個(gè)讀者讀,
?16??*??就取得了寫權(quán)利,
?17??*??而沒有的話,rsem對(duì)了寫者前面的都會(huì)去讀,意義不大。
?18??*??if?(writecount?==?1)????
?19?????????sem_wait(&sem_rsem);
?20?????確保了后續(xù)寫者相對(duì)讀者的優(yōu)先地位.這個(gè)是主要的寫者優(yōu)勢(shì)。
?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;?????//競(jìng)爭(zhēng)rsem失敗后,后續(xù)讀者在此排隊(duì)
?30?static?sem_t?sem_wsem;??//保證讀寫,寫寫互斥
?31?static?sem_t?sem_rsem;??//當(dāng)一個(gè)寫者出現(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的競(jìng)爭(zhēng)中優(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é)
以上是生活随笔為你收集整理的信号量 读者写者问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cisco 3550配置DHCP的实际经
- 下一篇: 上海机场股票为什么会跌 这两大外在影响因