Linux下进程同步问题——生产者消费者

生产者消费者

设计思路,首先有缓冲区内资源,生产者消费者都用,而且是资源信号量,那么需要建立两个信号量,一个代表空闲的个数,一个代表非空闲个数。
同时缓冲区的使用是互斥的,所以需要建立一个互斥信号量。

生产者

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<semaphore.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<unistd.h>
#include<pthread.h>
//server
int main()
{
    sem_t *cache_1 = sem_open("cache1",O_CREAT,0666,10);   //建立有名信号量,初值是10,表示的是缓冲区空闲的个数
    sem_t *cache_2 = sem_open("cache2",O_CREAT,0666,0);			//建立有名信号量,初值是0,表示的是缓冲区内已占用个数
    sem_t *mutex = sem_open("mutex",O_CREAT,0666,1);		//建立有名信号量,初值是1,表示缓冲区的互斥使用权
    while(1){
        sem_wait(cache_1);   //等待缓冲区有空闲
        sem_wait(mutex);		//等待缓冲区使用权
        int num;
        sem_getvalue(cache_2,&num);   //使用sem_getvalue获取信号量的值,为了表示当前缓冲区内有多少个已占用位置
        printf("production\n");
        printf("The current is %d\n",num+1);
        sem_post(mutex);
        sem_post(cache_2);
    }
}

消费者

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<semaphore.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<unistd.h>
#include<pthread.h>
//client
int main()
{
    sem_t *cache_1 = sem_open("cache1",O_CREAT,0666,10);   //建立有名信号量,初值是10,表示的是缓冲区空闲的个数
    sem_t *cache_2 = sem_open("cache2",O_CREAT,0666,0);		//建立有名信号量,初值是0,表示的是缓冲区内已占用个数
    sem_t *mutex = sem_open("mutex",O_CREAT,0666,1);	建立有名信号量,初值是1,表示缓冲区的互斥使用权
    while(1){
        sem_wait(cache_2);		//省略
        sem_wait(mutex);		//省略
        int num;
        sem_getvalue(cache_2,&num);
        printf("consume\n");
        printf("The current is %d\n",num);
        sem_post(mutex);
        sem_post(cache_1);
    }
}

注意 sem_open中的O_CREAT标志是指的,如果当前系统环境中没有此信号量,那么就创建一下,如果有,那么就打开。

代码中并没有对信号量进行释放,这点待补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值