编程实现经典的进程同步问题--读者与写者问题。
时间: 2023-09-14 15:07:11 浏览: 45
以下是一个基于互斥锁和条件变量的 C 语言代码实现,用于解决经典的读者写者问题:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define BUFFER_SIZE 1024 // 缓冲区大小
#define READ_COUNT 10 // 读取次数
#define WRITE_COUNT 5 // 写入次数
// 全局变量定义
char buffer[BUFFER_SIZE]; // 缓冲区
int read_count = 0; // 当前读者数量
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 互斥锁
pthread_cond_t read_cond = PTHREAD_COND_INITIALIZER; // 读条件变量
pthread_cond_t write_cond = PTHREAD_COND_INITIALIZER; // 写条件变量
// 读者线程函数
void *reader(void *arg) {
int i;
for (i = 0; i < READ_COUNT; i++) {
pthread_mutex_lock(&mutex); // 加锁
// 等待写者释放锁
while (buffer[0] == '\0') {
pthread_cond_wait(&read_cond, &mutex);
}
// 读取缓冲区内容
printf("Reader %ld start reading: %s\n", (long)arg, buffer);
// 读者数量加一
read_count++;
// 唤醒其他读者
pthread_cond_broadcast(&read_cond);
pthread_mutex_unlock(&mutex); // 解锁
}
pthread_exit(NULL);
}
// 写者线程函数
void *writer(void *arg) {
int i;
for (i = 0; i < WRITE_COUNT; i++) {
pthread_mutex_lock(&mutex); // 加锁
// 等待读者释放锁
while (read_count > 0) {
pthread_cond_wait(&write_cond, &mutex);
}
// 写入缓冲区内容
sprintf(buffer, "Writer %ld wrote a message.", (long)arg);
printf("Writer %ld wrote: %s\n", (long)arg, buffer);
// 唤醒其他等待的线程
pthread_cond_broadcast(&write_cond);
pthread_cond_broadcast(&read_cond);
pthread_mutex_unlock(&mutex); // 解锁
}
pthread_exit(NULL);
}
int main() {
pthread_t readers[3], writers[2]; // 创建3个读者线程和2个写者线程
int i;
// 创建读者线程
for (i = 0; i < 3; i++) {
pthread_create(&readers[i], NULL, reader, (void *)(long)i);
}
// 创建写者线程
for (i = 0; i < 2; i++) {
pthread_create(&writers[i], NULL, writer, (void *)(long)i);
}
// 等待所有线程结束
for (i = 0; i < 3; i++) {
pthread_join(readers[i], NULL);
}
for (i = 0; i < 2; i++) {
pthread_join(writers[i], NULL);
}
return 0;
}
```
在这个例子中,我们通过创建3个读者线程和2个写者线程来模拟读者写者问题。当有读者正在读取资源时,写者必须等待读者全部释放锁才能写入资源。当有写者正在写入资源时,所有读者必须等待写者释放锁才能读取资源。通过互斥锁和条件变量的配合,可以实现读者写者问题的安全同步。