資源簡介
模擬吃水果的同步模型:桌子上有一只盤子,最多可容納兩個水果,每次只能放入或者取出一個水果。爸爸專門向盤子中放蘋果,媽媽專門向盤子中放橘子,兩個兒子專門等待吃盤子中的橘子,兩個女兒專門等吃盤子中的蘋果。

代碼片段和文件信息
/*
This?program?default?set:
???the?time?of?father?put?the?apple?:?3s
???the?time?of?mother?put?the?orange?:?3s
???the?count?of?BigSon?eat?oranges?:?5????????3s/one
???the?count?of?LittleSon?eat?oranges?:?4?????3s/one
???the?count?of?BigDaughter?eat?apples?:?3????4s/one
???the?count?of?BigDaughter?eat?apples?:?2????4s/one
*/
#include?
#include?
#include????????//define?EXIT_*
#include?
#include?
#include?
#define?threadNum?6
void?*threadFunct(void?*arg);
void?showInfo();
sem_t?availPut;??????????//還可以往盤子里放幾個水果
sem_t?apple;?????????????//同步信號量
sem_t?orange;
pthread_mutex_t?appleLock;??????//互斥瑣
pthread_mutex_t?orangeLock;
int?appleNum=1;
int?orangeNum=1;
short?appleNeed=1;
short?orangeNeed=1;
short?appleNeed_LD=1;
short?appleNeed_BD=1;
short?orangeNeed_BS=1;
short?orangeNeed_LS=1;
FILE?*fp;
char*?name[threadNum]={“Father““Mother““BigSon““LittleSon““BigDaughter““LittleDaughter“};
int?main?(){
int?res;
int?i;
pthread_t?threadArray[threadNum];
void?*thread_res;
fp=fopen(“result_info““w“);
res=sem_init(&availPut00);
if?(res!=0){
perror?(“availPut?Semaphone?init?failed!“);
exit(EXIT_FAILURE);
}
res=sem_init(&apple01);
if?(res!=0){
perror?(“apple?Semaphone?init?failed!“);
exit(EXIT_FAILURE);
}
res=sem_init(&orange01);
if?(res!=0){
perror?(“orange?Semaphone?init?failed!“);
exit(EXIT_FAILURE);
}
res=pthread_mutex_init(&appleLockNULL);
if?(res!=0){
perror?(“apple?huchi?Semaphone?init?failed!“);
exit(EXIT_FAILURE);
}
res=pthread_mutex_init(&orangeLockNULL);
if?(res!=0){
perror?(“orange?huchi?Semaphone?init?failed!“);
exit(EXIT_FAILURE);
}
showInfo();
for?(i=0;i res=pthread_create(&threadArray[i]NULLthreadFunct(void?*)i);
if?(res==0){
fprintf(fp“***?%s?***?thread?create?succeed?!\n“name[i]);
???}else{
perror?(“thread?create?failed!\n“);
exit(EXIT_FAILURE);
}
}
//sleep(2);
for?(i=threadNum-1;i>=0;i--){
??res=pthread_join(threadArray[i]&thread_res);
if?(res==0){
fprintf(fp“pick?up?###?%s?###?thread?%d\n“name[i]i);
}else{
perror?(“Thread?join?failed!“);
?????}
}
fprintf(fp“Thread?joinall?threads?finished!\n“);
showInfo();
sem_destroy(&availPut);
sem_destroy(&apple);
sem_destroy(&orange);
pthread_mutex_destroy(&appleLock);
pthread_mutex_destroy(&orangeLock);
exit(EXIT_SUCCESS);
}
???void?showInfo(){????//sem_t?is?defined?in?/usr/include/bits/semaphore.h?
??????????????????????????????????????????//?(long?int)orange.__align
fprintf(fp“\n*********************************\n“);
fprintf(fp“There?are?%d?apple(s)?%d?orange(s)\n“appleNumorangeNum);
fprintf(fp“*********************************\n“);
}
void?*threadFunct(void?*arg){
???int?n=(int)arg;
???int?i;
switch(n)
{
case?0:????????//father
{
??sleep(1);
??i=1;
?while(appleNeed){
???sem_wait(&availPut);??//P?-1
??fprintf(fp“\n----------------------\n“);
??fprintf(fp“Father?put?an?apple\n“);
??fprintf(fp“Father?have?put?%d?apple(s)\n“i++);
??fprintf(fp“-------
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2011-01-18?15:32??fruits\
?????文件???????16627??2011-01-18?10:35??fruits\fruit
?????文件????????8382??2011-01-18?10:34??fruits\fruit.c
?????文件????????8362??2011-01-18?15:32??fruits\fruit.txt
?????文件???????12350??2011-01-18?10:35??fruits\fruits
?????文件????????5892??2011-01-17?21:41??fruits\fruits.c
?????文件?????????218??2011-01-18?09:32??fruits\Makefile
?????文件????????6153??2011-01-18?10:39??fruits\result_info
?????文件?????1271211??2011-01-18?21:17??操作系統課設報告.doc
- 上一篇:GPS數據轉谷歌地圖軌跡的工具NMEA2KMZ301
- 下一篇:教師教學輔助系統開發
評論
共有 條評論