信号量实现生产者消费者模型,可以无需互斥量(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;
}