• 大小: 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


评论

共有 条评论