#include
typedef struct Node {
int data;
struct Node *next;
} Node;
typedef struct Buffer {
Node *head;
Node *tail;
int size;
pthread_mutex_t mutex;
pthread_cond_t cond_producer;
pthread_cond_t cond_consumer;
sem_t empty; //定义空缓冲区信号量
sem_t full; //定义满缓冲区信号量
} Buffer;
int length[MAX_BUFFER_SIZE]; void buffer_init(Buffer *buffer) {
buffer->head = NULL;
buffer->tail = NULL;
buffer->size = 0;
pthread_mutex_init(&(buffer->mutex), NULL);
pthread_cond_init(&(buffer->cond_producer), NULL);
pthread_cond_init(&(buffer->cond_consumer), NULL);
sem_init(&(buffer->empty), 0, MAX_BUFFER_SIZE); //初始化空缓冲区信号量为MAX_BUFFER_SIZE
sem_init(&(buffer->full), 0, 0); //初始化满缓冲区信号量为0
}
void buffer_put(Buffer *buffer, int data) {
sem_wait(&(buffer->empty)); //等待空缓冲区信号量
pthread_mutex_lock(&(buffer->mutex));
Node *node = (Node *)malloc(sizeof(Node));
node->data = data;
node->next = NULL;
if (buffer->tail == NULL)
{
buffer->head = node;
buffer->tail = node;
}
else
{
buffer->tail->next = node;
buffer->tail = node;
}
buffer->size++;
printf("Produced %d (buffer size: %d)\n", data, buffer->size);
pthread_cond_broadcast(&(buffer->cond_consumer));
pthread_mutex_unlock(&(buffer->mutex));
sem_post(&(buffer->full)); //增加满缓冲区信号量
usleep(rand()%111111);
}
int buffer_get(Buffer *buffer) {
sem_wait(&(buffer->full)); //等待满缓冲区信号量
pthread_mutex_lock(&(buffer->mutex));
Node *node = buffer->head;
int data = node->data;
buffer->head = node->next;
if (buffer->head == NULL)
{
buffer->tail = NULL;
}
buffer->size--;
printf("Consumed %d (buffer size: %d)\n", data, buffer->size);
free(node);
pthread_cond_broadcast(&(buffer->cond_producer));
pthread_mutex_unlock(&(buffer->mutex));
sem_post(&(buffer->empty)); //增加空缓冲区信号量
usleep(rand()%100000);
return data;
}
void *producer(void *arg) {
Buffer *buffer = (Buffer *)arg;
time_t start_time = time(NULL);
for (int i = 0;difftime(time(NULL), start_time) <=100; i++)
{
buffer_put(buffer, i);
}
printf("producers were tied! Stop the project.\n");
exit(0);
return NULL;
}
void *consumer(void *arg) {
Buffer *buffer = (Buffer *)arg;
for (int i = 0; ; i++)
{
buffer_get(buffer);
}
return NULL;
}
int main() {
Buffer buffer;
buffer_init(&buffer);
pthread_t producer_thread;
pthread_t consumer_thread;
pthread_create(&producer_thread, NULL, producer, &buffer);
pthread_create(&consumer_thread, NULL, consumer, &buffer);
pthread_join(producer_thread, NULL);
pthread_join(consumer_thread, NULL);
return 0;
}