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