-
大小: 5.65 KB文件類型: .rar金幣: 1下載: 0 次發(fā)布日期: 2024-10-04
- 語言: 其他
- 標(biāo)簽:
資源簡介
這是一個在linux系統(tǒng)下用多進程同步的方法解決消費者-生產(chǎn)者問題的源代碼,是關(guān)于操作系統(tǒng)的。
代碼片段和文件信息
#include?“stdio.h“
#include?
#include?
#include?
#include?
#include?
#include???
/*緩沖區(qū)的最大數(shù)*/
#define???Size???20
//記錄生產(chǎn)者的人數(shù)
int??sh=0;
//記錄消費者的人數(shù)
int??xiao1=0;
/*緩沖區(qū)的結(jié)構(gòu)體*/
struct??huan{
int????isHave;????//標(biāo)記緩沖區(qū)是否有內(nèi)容有內(nèi)容時消費者才可以使用
?????????????????????????????????//沒內(nèi)容時生產(chǎn)者才?可以往緩沖區(qū)內(nèi)寫東西
?????????????????????????????????//0表示沒有內(nèi)容1表示有內(nèi)容
int???jud;??????????//標(biāo)志緩沖區(qū)是否在被使用中0代表未被使用1表示使用中
int??context;?????//緩沖的內(nèi)容
};
//描述生產(chǎn)者或者是消費者
struct??person{
int??end;????//記錄是否完成任務(wù)0表示完成,1表示未完成任務(wù)
char??*??name;???/*線程名*/
pthread_t?thread;???/*線程句柄*/
};
/*控制線程*/
//pthread_t?thread;
//緩沖區(qū)
struct??huan?*?huan[20];
//生產(chǎn)者,最多有10個生產(chǎn)者
struct??person?*?sheng[10];
//消費者,最多有10個消費者
struct??person?*?xiao[10];
//要放進入緩沖的內(nèi)容的標(biāo)記
int???context=1;
int?timesj(int?i)???????//timesj函數(shù),可產(chǎn)生一個隨機數(shù)返回
{
??int?xt;
??//為偽隨機數(shù)初始化
?
??xt?=?rand()?%i+1;
??return?xt;
}
//生產(chǎn)者往緩沖區(qū)內(nèi)放東西
//i是緩沖區(qū)的下標(biāo)值context是要放入緩沖區(qū)的內(nèi)容currentSheng是當(dāng)前放進去的生產(chǎn)者
void??put(int?iint?context?struct??person???*??currentSheng){
huan[i]->jud=1;????//標(biāo)志緩沖區(qū)正在使用
printf(“\n生產(chǎn)者%s?往緩沖區(qū)%d?中寫入%d“¤tSheng->nameicontext);??
?????????????????????????????????????//輸出當(dāng)前生產(chǎn)者的名字,緩沖區(qū)的下標(biāo)值和對應(yīng)緩沖區(qū)里的內(nèi)容
??????????????????????huan[i]->context=context;???//?往緩沖區(qū)中放入內(nèi)容
huan[i]->isHave=1;?????//表示有內(nèi)容
huan[i]->jud=0;???????//釋放空間,緩沖區(qū)未被使用
}
//消費者往緩沖區(qū)內(nèi)拿東西
//i是緩沖區(qū)的下標(biāo)值currentXiao是當(dāng)前拿緩沖區(qū)東西的消費者
int??take(int?istruct??person?*??currentXiao){
huan[i]->jud=1;????//標(biāo)志緩沖區(qū)正在使用
printf(“\n消費者%s?往緩沖區(qū)%d?中拿出%d“¤tXiao->nameihuan[i]->context);
??????????????????????????????????????????????????//輸出當(dāng)前消費者的名字,緩沖區(qū)的下標(biāo)值和對應(yīng)緩沖區(qū)里的內(nèi)容
huan[i]->isHave=0;????//表示沒有內(nèi)容
huan[i]->jud=0;????????//釋放空間,緩沖區(qū)未被使用
}
void??*??shengchan(struct??person??*??currentSheng){
int??i=0;
for(i=0;i ????????????????????????????????????????????//如果緩沖區(qū)沒有內(nèi)容而且緩沖區(qū)未被使用
if(huan[i]->isHave==0&&huan[i]->jud==0){
put(icontext++currentSheng);????//當(dāng)前生產(chǎn)者往里面放內(nèi)容
sleep(timesj(3));????//掛起一段時間
????????????????????????????????????????????????????????????????????//線程沉睡若干秒模仿線程因為工作而使用了的時間
????????????????????????????????????????????????????????????????????
}?
}
currentSheng->end=1;?????//當(dāng)前生產(chǎn)者任務(wù)未完成
}
void??*??xiaofei(struct??person?*??currentXiao){
int??i=0;
while(context<20)
for(i=0;i ???????????????????????????????????????????????//如果緩沖區(qū)有內(nèi)容而且緩沖區(qū)未被使用
if(huan[i]->isHave==1&&huan[i]->jud==0){
take(icurrentXiao);???//當(dāng)前消費者取出緩沖區(qū)的內(nèi)容
sleep(timesj(3));??//掛起一段時間
//線程沉睡若干秒模仿線程因為工作而使用了的時間
}
}
currentXiao->end=1;???//當(dāng)前消費者未完成任務(wù)
}
int??getNumber(){
int???a;
? a=-99999;
while(1){
scanf(“%d“&a);
getchar();
if(a<=-99999){
?printf(“\n你輸入的不是數(shù)字,請重新輸入:“);
}
else??break;
}
return?a;
}
int?main(){
?int?i=0j=0;
?time_t?t;
?
?//為隨機函數(shù)做準(zhǔn)備
?srand((unsigned)?time(&t));???//?以系統(tǒng)時間做種子,初始
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????7468??2008-01-21?00:24??linux下用多進程同步方法解決生產(chǎn)者-消費者問題源代碼\src\Main
?????文件???????6938??2008-01-22?09:37??linux下用多進程同步方法解決生產(chǎn)者-消費者問題源代碼\src\Main.c
?????目錄??????????0??2008-01-22?09:38??linux下用多進程同步方法解決生產(chǎn)者-消費者問題源代碼\src
?????目錄??????????0??2008-12-05?22:32??linux下用多進程同步方法解決生產(chǎn)者-消費者問題源代碼
-----------?---------??----------?-----??----
????????????????14406????????????????????4
評論
共有 條評論