在Linux系统下生产者消费者,操作系统实验之linux下实现生产者与消费者问题

在buffer.h中的代码如下:

typedef int buffer_item;

#define BUFFER_SIZE 5

#define MAX_PRODUCER 20

#define MAX_CONSUMER 20

在MainDriver.cpp中的代码如下:

#include

#include

 #include

#include

#include

typedef int buffer_item;

#define BUFFER_SIZE 5

#define MAX_PRODUCER 20

#define MAX_CONSUMER 20

pthread_mutex_t mutex;

sem_t hEmpty;

sem_t hFull;

pthread_t hProducer[MAX_PRODUCER];

pthread_t hConsumer[MAX_CONSUMER];

buffer_item buffer[BUFFER_SIZE];

int in=0; int out=0;

void get_Condition( int& t, int& p,

int& c )

{

cout<

sleep before terminating\n";

cin>>t;

cout<

number of producer threads to create\n";

cin>>p;

cout<

number of consumer threads to create\n";

cin>>c;

cout<

}

void Randomize()

{

srand((unsigned int)(time(NULL)%10000));

}

int insert_item( buffer_item item )

{

if( (in+1)%(BUFFER_SIZE+1)==out)

return 1;

buffer[in]=item;

in=(in+1)%(BUFFER_SIZE+1);

return 0;

}

int remove_item( buffer_item* item )

{

if(in==out)

return

1;

*item=buffer[out];

out=(out+1)%BUFFER_SIZE;

return 0;

}

void *producer( void* param )

{

int*

p=(int*)param;

buffer_item rand_num;

while(true)

{ sem_wait(&hEmpty); //Empty iniatal as 5

pthread_mutex_lock(&mutex);

rand_num=rand()%100+p[0];

cout<

"<

want to produce: "<

if(insert_item(rand_num))

cout<

error condition\n";

else

{

cout<

"<

produced

"<

cout<

"<

task done\n";

}

pthread_mutex_unlock(&mutex);

sem_post(&hFull);

cout<

usleep(1000);

}

return

0;

}

void *consumer( void* param )

{

int* p=(int*)param;

buffer_item rand_num;

while(true)

{

sem_wait(&hFull);

pthread_mutex_lock(&mutex);

cout<

"<

want to consumer: "<

if(remove_item(&rand_num))

cout<

error condition\n";

else

{

cout<

"<

consumed

"<

cout<

"<

task done!\n";

}

pthread_mutex_unlock(&mutex);

sem_post(&hEmpty);

cout<

usleep(1000);

}

return

0;

}

void create_Producer( int num )

{

for( int i=0; i

{

int* a=new int[1];

a[0]=i;

pthread_create(&hProducer[i],NULL,producer,a);

usleep(10);

}

}

void create_Consumer( int num )

{

for( int i=0; i

{

int* b=new int[1];

b[0]=i;

pthread_create(&hConsumer[i],NULL,consumer,b);

usleep(10);

}

}

int main()

{

sem_init(&hEmpty,0,BUFFER_SIZE);

sem_init(&hFull,0,1);

pthread_mutex_init(&mutex,NULL);

int time_sleep,pro_num,con_num;

get_Condition(time_sleep, pro_num,

con_num);

Randomize();

create_Producer( pro_num );

create_Consumer( con_num );

for( int i=0; i

pthread_join(hProducer[i],NULL);

for( int j=0; j

pthread_join(hConsumer[j],NULL);

usleep(time_sleep);

exit(1);

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值