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