C语言实现PingPang Buffer:生产者-消费者模式
以下是一个使用C语言实现PingPang Buffer的简单示例:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define BUFFER_SIZE 10
// PingPang Buffer 结构体
typedef struct {
int buffer[BUFFER_SIZE];
int read_index;
int write_index;
pthread_mutex_t mutex;
pthread_cond_t read_cond;
pthread_cond_t write_cond;
} PingPangBuffer;
// 初始化PingPang Buffer
void init_pingpang_buffer(PingPangBuffer* buffer) {
buffer->read_index = 0;
buffer->write_index = 0;
pthread_mutex_init(&buffer->mutex, NULL);
pthread_cond_init(&buffer->read_cond, NULL);
pthread_cond_init(&buffer->write_cond, NULL);
}
// 写入数据到PingPang Buffer
void write_pingpang_buffer(PingPangBuffer* buffer, int data) {
pthread_mutex_lock(&buffer->mutex);
while ((buffer->write_index + 1) % BUFFER_SIZE == buffer->read_index) {
pthread_cond_wait(&buffer->write_cond, &buffer->mutex);
}
buffer->buffer[buffer->write_index] = data;
buffer->write_index = (buffer->write_index + 1) % BUFFER_SIZE;
pthread_cond_signal(&buffer->read_cond);
pthread_mutex_unlock(&buffer->mutex);
}
// 从PingPang Buffer读取数据
int read_pingpang_buffer(PingPangBuffer* buffer) {
pthread_mutex_lock(&buffer->mutex);
while (buffer->read_index == buffer->write_index) {
pthread_cond_wait(&buffer->read_cond, &buffer->mutex);
}
int data = buffer->buffer[buffer->read_index];
buffer->read_index = (buffer->read_index + 1) % BUFFER_SIZE;
pthread_cond_signal(&buffer->write_cond);
pthread_mutex_unlock(&buffer->mutex);
return data;
}
// 测试程序
void* producer(void* arg) {
PingPangBuffer* buffer = (PingPangBuffer*)arg;
for (int i = 0; i < 20; i++) {
write_pingpang_buffer(buffer, i);
printf('producer write: %d\n', i);
}
return NULL;
}
void* consumer(void* arg) {
PingPangBuffer* buffer = (PingPangBuffer*)arg;
for (int i = 0; i < 20; i++) {
int data = read_pingpang_buffer(buffer);
printf('consumer read: %d\n', data);
}
return NULL;
}
int main() {
PingPangBuffer buffer;
init_pingpang_buffer(&buffer);
pthread_t producer_thread, 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;
}
该程序使用了一个PingPang Buffer结构体来实现数据的生产和消费。生产者线程通过调用write_pingpang_buffer函数向PingPang Buffer中写入数据,消费者线程通过调用read_pingpang_buffer函数从PingPang Buffer中读取数据。当PingPang Buffer已经满(即写指针和读指针相差1)时,生产者线程将被阻塞,直到有空间可用。当PingPang Buffer为空时,消费者线程将被阻塞,直到有数据可用。使用条件变量来实现线程的阻塞和唤醒。
原文地址: https://www.cveoy.top/t/topic/lfpP 著作权归作者所有。请勿转载和采集!