操作系统概念第七版上第六章的项目“生产者-消费者问题”的解答。
采用了三个信号量:empty(记录多少个空位),full(记录有多少满位)以及mutex(二进制信号量以保护对缓冲的插入与删除操作)。
buffer.h头文件声明了缓冲区数据类型,缓冲大小,以及对缓冲区可采取的操作。
/*buffer.h*/
typedef int buffer_item;
#define BUFFER_SIZE 5
int insert_item(buffer_item);
int remove_item(buffer_item *);
void printBuffer();
buffer.c为缓冲区插入,删除以及打印操作的具体实现。
/*buffer.c*/
#include <stdio.h>
#include "buffer.h"
static buffer_item buffer[BUFFER_SIZE];
static int counter, in, out;
int insert_item(buffer_item item) {
if (counter == BUFFER_SIZE) {
return -1;
} else {
buffer[in] = item;
in = (in + 1) % BUFFER_SIZE;
counter++;
return 0;
}
}
int remove_item(buffer_item *item) {
if (counter == 0) {
return -1;
} else {
*item = buffer[out];
buffer[out] = 0;