用信号量解决经典同步问题(生产者消费者问题,哲学家进餐问题,读者写者问题,至少完成其中任意两个问题)用c语言解决
时间: 2023-08-10 13:19:30 浏览: 95
以下是使用信号量解决生产者消费者问题和读者写者问题的C语言代码示例:
### 生产者消费者问题
```c
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#define N 10 // 缓冲区大小
int buffer[N]; // 缓冲区
int in = 0, out = 0; // 生产者、消费者指针
sem_t empty, full, mutex; // 信号量
void *producer(void *arg) {
int i, item;
for (i = 0; i < 20; i++) {
item = i + 1;
sem_wait(&empty); // 等待空缓冲区
sem_wait(&mutex); // 互斥访问缓冲区
buffer[in] = item;
in = (in + 1) % N;
printf("Producer produced item %d\n", item);
sem_post(&mutex); // 释放缓冲区访问权
sem_post(&full); // 发送满缓冲区信号
}
pthread_exit(NULL);
}
void *consumer(void *arg) {
int i, item;
for (i = 0; i < 20; i++) {
sem_wait(&full); // 等待满缓冲区
sem_wait(&mutex); // 互斥访问缓冲区
item = buffer[out];
out = (out + 1) % N;
printf("Consumer consumed item %d\n", item);
sem_post(&mutex); // 释放缓冲区访问权
sem_post(&empty); // 发送空缓冲区信号
}
pthread_exit(NULL);
}
int main() {
pthread_t t1, t2;
sem_init(&empty, 0, N); // 缓冲区空信号量初始化为N
sem_init(&full, 0, 0); // 缓冲区满信号量初始化为0
sem_init(&mutex, 0, 1); // 互斥信号量初始化为1
pthread_create(&t1, NULL, producer, NULL);
pthread_create(&t2, NULL, consumer, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
sem_destroy(&empty);
sem_destroy(&full);
sem_destroy(&mutex);
return 0;
}
```
### 读者写者问题
```c
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#define N 5 // 缓冲区大小
int buffer = 0; // 共享数据
int readcount = 0; // 读者计数器
sem_t wsem, rsem, mutex; // 信号量
void *writer(void *arg) {
int i, item;
for (i = 0; i < 10; i++) {
item = i + 1;
sem_wait(&wsem); // 等待写者信号量
sem_wait(&mutex); // 互斥访问共享数据
buffer = item;
printf("Writer wrote item %d\n", item);
sem_post(&mutex); // 释放共享数据访问权
sem_post(&rsem); // 发送读者信号量
}
pthread_exit(NULL);
}
void *reader(void *arg) {
int i, item;
for (i = 0; i < 10; i++) {
sem_wait(&rsem); // 等待读者信号量
sem_wait(&mutex); // 互斥访问共享数据
readcount++;
if (readcount == 1) {
sem_wait(&wsem); // 第一个读者等待写者信号量
}
sem_post(&mutex); // 释放共享数据访问权
item = buffer;
printf("Reader read item %d\n", item);
sem_wait(&mutex); // 互斥访问共享数据
readcount--;
if (readcount == 0) {
sem_post(&wsem); // 最后一个读者释放写者信号量
}
sem_post(&mutex); // 释放共享数据访问权
}
pthread_exit(NULL);
}
int main() {
pthread_t t1, t2, t3, t4;
sem_init(&wsem, 0, 1); // 写者信号量初始化为1
sem_init(&rsem, 0, 0); // 读者信号量初始化为0
sem_init(&mutex, 0, 1); // 互斥信号量初始化为1
pthread_create(&t1, NULL, writer, NULL);
pthread_create(&t2, NULL, reader, NULL);
pthread_create(&t3, NULL, reader, NULL);
pthread_create(&t4, NULL, reader, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
pthread_join(t3, NULL);
pthread_join(t4, NULL);
sem_destroy(&wsem);
sem_destroy(&rsem);
sem_destroy(&mutex);
return 0;
}
```
阅读全文