计算机组成原读者与写者问题代码
时间: 2024-06-01 07:10:52 浏览: 19
以下是读者-写者问题的代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#define N 5 // 缓冲区大小
sem_t mutex; // 互斥信号量
sem_t write_mutex; // 写者互斥信号量
sem_t read_mutex; // 读者互斥信号量
int buffer[N]; // 缓冲区
int read_count = 0; // 当前正在读取的读者数量
void *writer(void *arg);
void *reader(void *arg);
int main()
{
// 初始化信号量
sem_init(&mutex, 0, 1);
sem_init(&write_mutex, 0, 1);
sem_init(&read_mutex, 0, 1);
// 创建读者和写者线程
pthread_t writers[3];
pthread_t readers[3];
for (int i = 0; i < 3; i++) {
pthread_create(&writers[i], NULL, writer, (void *)i);
pthread_create(&readers[i], NULL, reader, (void *)i);
}
// 等待所有线程结束
for (int i = 0; i < 3; i++) {
pthread_join(writers[i], NULL);
pthread_join(readers[i], NULL);
}
// 销毁信号量
sem_destroy(&mutex);
sem_destroy(&write_mutex);
sem_destroy(&read_mutex);
return 0;
}
void *writer(void *arg)
{
int id = (int)arg;
printf("writer %d started\n", id);
while (1) {
sleep(1);
// 写者互斥
sem_wait(&write_mutex);
// 写入数据
int data = rand() % 100;
printf("writer %d writing data %d\n", id, data);
buffer[id] = data;
// 写者互斥
sem_post(&write_mutex);
}
return NULL;
}
void *reader(void *arg)
{
int id = (int)arg;
printf("reader %d started\n", id);
while (1) {
sleep(1);
// 读者互斥
sem_wait(&read_mutex);
// 读者计数器
read_count++;
if (read_count == 1) {
// 第一个读者需要获取互斥信号量
sem_wait(&mutex);
}
// 读者互斥
sem_post(&read_mutex);
// 读取数据
printf("reader %d reading data %d\n", id, buffer[id]);
// 读者互斥
sem_wait(&read_mutex);
// 读者计数器
read_count--;
if (read_count == 0) {
// 最后一个读者需要释放互斥信号量
sem_post(&mutex);
}
// 读者互斥
sem_post(&read_mutex);
}
return NULL;
}