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

2023-10-20 18:14:30 浏览数 (1)

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


【代码实现】

代码语言:javascript复制
#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 %dn”, 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 %dn”, 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;
}

0 人点赞