用信号量解决经典同步问题(生产者消费者问题,哲学家进餐问题,读者写者问题,至少完成其中任意两个问题)用c语言解决
时间: 2023-08-10 10:19:30 浏览: 90
C语言信号量同步与互斥生产者消费者互斥锁读写者问题哲学家就餐问题课程设计
5星 · 资源好评率100%
以下是使用信号量解决生产者消费者问题和读者写者问题的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;
}
```
阅读全文