根据实验要求写一个C语言代码,实验要求:问题描述: 读者可同时读; 读者读时,写者不可写; 写者写时,其他的读者、写者均不可进入。 要求:在主线程中创建线程分别模拟读者和写者的活动过程,实现两者的同步运行。
时间: 2024-03-21 07:42:03 浏览: 55
读者-写者问题C源代码.pdf
好的,以下是一个可能的实现:
```
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
sem_t Wmutex, Rmutex;
int Rcount = 0;
void *reader(void *arg) {
int id = *(int *)arg;
while (1) {
sem_wait(&Rmutex);
if (Rcount == 0) {
sem_wait(&Wmutex);
}
Rcount++;
sem_post(&Rmutex);
// 读操作
printf("Reader %d is reading...\n", id);
sem_wait(&Rmutex);
Rcount--;
if (Rcount == 0) {
sem_post(&Wmutex);
}
sem_post(&Rmutex);
}
}
void *writer(void *arg) {
int id = *(int *)arg;
while (1) {
sem_wait(&Wmutex);
// 写操作
printf("Writer %d is writing...\n", id);
sem_post(&Wmutex);
}
}
int main() {
sem_init(&Wmutex, 0, 1);
sem_init(&Rmutex, 0, 1);
pthread_t readers[3], writers[2];
int reader_ids[3] = {1, 2, 3};
int writer_ids[2] = {1, 2};
for (int i = 0; i < 3; i++) {
pthread_create(&readers[i], NULL, reader, (void *)&reader_ids[i]);
}
for (int i = 0; i < 2; i++) {
pthread_create(&writers[i], NULL, writer, (void *)&writer_ids[i]);
}
for (int i = 0; i < 3; i++) {
pthread_join(readers[i], NULL);
}
for (int i = 0; i < 2; i++) {
pthread_join(writers[i], NULL);
}
sem_destroy(&Wmutex);
sem_destroy(&Rmutex);
return 0;
}
```
这个实现中,我们使用了两个信号量Wmutex和Rmutex,分别用于控制写者和读者的访问。读者和写者都是使用线程来实现的,在主线程中创建了三个读者线程和两个写者线程。
在reader线程中,先使用sem_wait(&Rmutex)来申请对Rcount的访问权,Rcount表示当前有几个读者正在读取。如果Rcount是0,说明没有读者正在读取,那么这个读者需要申请对Wmutex的访问权,以防止写者进入。然后Rcount加1,并且释放对Rmutex的访问权。
接下来进行读操作,这里只是简单地输出了一句话。
读操作完成后,再次申请对Rcount的访问权,Rcount减1。如果Rcount是0,说明没有读者正在读取,那么这个读者需要释放对Wmutex的访问权,让写者可以进入。最后释放对Rmutex的访问权。
在writer线程中,先使用sem_wait(&Wmutex)来申请对共享资源的访问权,然后进行写操作,同样只是简单地输出了一句话。写操作完成后,释放对Wmutex的访问权。
最后在主线程中使用pthread_join()函数来等待所有线程结束,并且在程序结束时销毁信号量。
阅读全文