消费者/生产者模型是多线程编程开发的常用模型,该模型通过平衡生产者线程和消费者线程的工作能力来提高程序整体的数据处理能力。
一般来说,我们的资源池是有限的,访问资源需要加锁,访问完以后需要解锁,生产者需要在资源池未满的情况下才能生产产品,消费者需要在资源池不空的情况下才能消费产品。且在设计时需要注意死锁问题。
下面采用semaphore,资源池为环形缓冲区,来实现生产者消费者模型:
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
#include <semaphore.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ERROR(func, no) { \
fprintf(stderr, "%s: %s\n", func, strerror(no)); \
exit(EXIT_FAILURE); \
}
#define DEFAULT_CONSUMER_CNT 1
#define DEFAULT_PRODUCER_CNT 3
#define DEFAULT_BUFFER_SIZE 10
static size_t in; // produc