信号量 读者写者问题
生活随笔
收集整理的這篇文章主要介紹了
信号量 读者写者问题
小編覺得挺不錯的,現(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 ?
?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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cisco 3550配置DHCP的实际经
- 下一篇: 微软回顾3项安全计划成果 有效降低***