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