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

生产者消费者

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

生产者

#include
#include
#include
#include
#include
#include
#include
#include
#include
//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
#include
#include
#include
#include
#include
#include
#include
#include
//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标志是指的,如果当前系统环境中没有此信号量,那么就创建一下,如果有,那么就打开。

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

你可能感兴趣的:(操作系统)