信号量实现的生产者消费者模型

信号量实现生产者消费者模型,可以无需互斥量(mutex)协助就能实现。实现方法是声明两个信号量变量,两个信号量分别代表可生产产品的数量和已经生产的产品数量,然后在线程函数中维护这两个信号量变量实现生产者消费者模型。


【代码实现】

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <stdlib.h>
#include <unistd.h>

#define NUM 5

int queue[NUM];
// blank代表空位,product代表产品
sem_t blank_number, product_number;

// 生产者
void* producer(void* arg)
{
	int p = 0;
	while (1)
	{
		// 将空位信号量-1
		sem_wait(&blank_number);
		queue[p] = rand() % 1000 + 1;
		printf("product %d\n", queue[p]);
		// 将产品信号量+1
		sem_post(&product_number);
		// 一个小算法,很使用
		p = (p + 1) % NUM;
		sleep(rand() % 5);
	}
	return (void*)0;
}

// 消费者
void* consumer(void* arg)
{
	int c = 0;
	while (1)
	{
		// 等待有产品后消费,将产品信号量-1
		sem_wait(&product_number);
		printf("consume %d\n", queue[c]);
		queue[c] = 0;
		// 消费完毕后将空位信号量+1
		sem_post(&blank_number);
		c = (c + 1) % NUM;
		sleep(rand() % 5);
	}
	return (void*)0;
}

int main(int argc, char* argv[])
{
	pthread_t pid, cid;
	sem_init(&blank_number, 0, NUM);
	sem_init(&product_number, 0, 0);

	pthread_create(&pid, NULL, producer, NULL);
	pthread_create(&cid, NULL, consumer, NULL);

	pthread_join(pid, NULL);
	pthread_join(cid, NULL);

	sem_destroy(&blank_number);
	sem_destroy(&product_number);
	return 0;
}

 

 

说说你的想法