#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <pthread.h>
#define MAX_QUE_SIZE 20
sem_t writable_num;
sem_t readable_num;
sem_t m_mutex;
int buffer[MAX_QUE_SIZE];
int write_pos;
int read_pos;
void *product(void *arg) {
int count = 0;
while(1) {
sem_wait(&writable_num);
sem_wait(&m_mutex);
printf("producer data done:%d\n", count);
buffer[write_pos] = count++;
write_pos = (write_pos + 1)%MAX_QUE_SIZE;
sem_post(&m_mutex);
sem_post(&readable_num);
}
}
void *consumer(void *arg) {
int count = 0;
while(1) {
sem_wait(&readable_num);
sem_wait(&m_mutex);
count = buffer[read_pos];
read_pos = (read_pos + 1) % MAX_QUE_SIZE;
printf("%d, consumer data done:%d\n", gettid(), count);
sem_post(&m_mutex);
sem_post(&writable_num);
sleep(1);
}
}
int main(void) {
sem_init(&writable_num, 0, MAX_QUE_SIZE);
sem_init(&readable_num, 0, 0);
sem_init(&m_mutex, 0, 1);
read_pos = write_pos = 0;
pthread_t tid1, tid2, tid3, tid4;
pthread_create(&tid1, NULL, product, NULL);
pthread_create(&tid2, NULL, consumer, NULL);
pthread_create(&tid3, NULL, consumer, NULL);
pthread_create(&tid4, NULL, consumer, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
pthread_join(tid3, NULL);
pthread_join(tid4, NULL);
sem_destroy(&writable_num);
sem_destroy(&readable_num);
sem_destroy(&m_mutex);
return 0;
}
多线程生产者消费者模型ringbuffer,作为练手用
于 2024-10-08 18:39:31 首次发布