进程间通信之信号量--使用信号实现生产者消费者问题

生产者消费者是数学中的一个经典的问题,也是编程中的一个经典问题。

本示例采用信号量来解决这个问题,其实,最终也就是进程之间同步的问题。

生产者源代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/stat.h>
#include <sys/sem.h>

int sem_id;
void init()
{
key_t key;
int ret;
unsigned short sem_array[2];   //0代表生产者,1代表消费者
union semun
{
int val;
struct semid_ds *buf;
unsigned short *array;
}arg;
key=ftok(".",'s');
sem_id=semget(key,2,0777|IPC_CREAT);
sem_array[0]=0;
sem_array[1]=100;
arg.array=sem_array;
ret=semctl(sem_id,0,SETALL,arg);
if(ret==-1)
{
perror("semctl");
exit(1);
}
printf("productor init is %d\n",semctl(sem_id,0,GETVAL));
printf("consumer  init is %d\n",semctl(sem_id,1,GETVAL));
}
void del()
{
semctl(sem_id,IPC_RMID,0);
}

int main()
{
struct sembuf sops[2];
int retv;
sops[0].sem_num= 0;
sops[0].sem_op  = 1;
sops[0].sem_flg = 0;
sops[1].sem_num= 1;
sops[1].sem_op  = -1;
sops[1].sem_flg = 0;
init();
printf("this is productor\n");
while(1)
{
printf("\n\nbefore produce\n");
printf("productor number is %d\n",semctl(sem_id,0,GETVAL));
printf("space number is %d\n",semctl(sem_id,1,GETVAL));
retv=semop(sem_id,&sops[1],1);
//if(retv==-1)
printf("no work semo on sops[0] retv%d\n",retv);
printf("now producting....\n");
retv=semop(sem_id,&sops[0],1);
//if(retv==-1)
printf("no work semo on sops[0] retv=%d\n",retv);
printf("\nafter produce\n");
printf("productor number is %d\n",semctl(sem_id,0,GETVAL));
printf("space number is %d\n",semctl(sem_id,1,GETVAL));
sleep(1);
}
del();
return 0;
}


 

消费者源代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/stat.h>
#include <sys/sem.h>
int sem_id;
void init()
{
key_t key;
key=ftok(".",'s');
sem_id=semget(key,2,0777|IPC_CREAT);
}
int main()
{

struct sembuf sops[2];
sops[0].sem_num= 0;
sops[0].sem_op  = -1;
sops[0].sem_flg = 0;
sops[1].sem_num= 1;
sops[1].sem_op  = 1;
sops[1].sem_flg = 0;
init();
printf("this is customer\n");
while(1)
{
printf("\n\nbefore consumer\n");
printf("productor number is %d\n",semctl(sem_id,0,GETVAL));
printf("space number is %d\n",semctl(sem_id,1,GETVAL));
semop(sem_id,&sops[0],1);
printf("now consuming....\n");
semop(sem_id,&sops[1],1);
printf("\nafter consume\n");
printf("productor number is %d\n",semctl(sem_id,0,GETVAL));
printf("space number is %d\n",semctl(sem_id,1,GETVAL));
sleep(3);
}





return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃鸳鸯锅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值