gpt4 book ai didi

c - 读者 - C 语言的作者 - 我哪里错了?

转载 作者:太空宇宙 更新时间:2023-11-04 08:31:58 24 4
gpt4 key购买 nike

我想寻求有关此任务的帮助。

我的任务是用 C 编写一个简单的程序来模拟读写器问题。程序要求是:

  1. 程序启动后,会要求用户输入作者和读者的输入次数。

  2. 程序会不断通知用户线程的状态。

  3. 程序结束后,小统计(每位读者读了多少次,每位作者写了多少次)。

我已经做了一些程序的基本结构(通过信号量等处理临界区),但是我觉得程序没有做的,应该做的。程序运行没有错误或意外行为,但计数,每个读者读了多少次,每个写者写了多少次,对于每个读者或写者总是一个。

我哪里错了?可能是我不太理解这个任务。

非常感谢您的回复。

程序代码:

#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>

sem_t w; // write access
sem_t m; // mutex
int rc=0; // readers count

int writersCount;
int readersCount;
pthread_t writersThread[10], readersThread[10];
int writeCount[10], readCount[10];
int i;

void *writer(void *i) {
int a = *((int *) i);

sem_wait(&w); // P(w)
printf("Writer %d writes to DB.\n",a+1);
writeCount[a+1]++;
sem_post(&w); // V(w)

free(i);
}

void *reader(void *i) {
int a = *((int *) i);

sem_wait(&m); // P(m)
rc++;
if (rc == 1) {
sem_wait(&w); // P(w)
}
sem_post(&m); // V (m)

printf("Reader %d reads from DB.\n",a+1);
readCount[a+1]++;

sem_wait(&m); // P(m)
rc--;
if (rc == 0) {
sem_post(&w); // V(w)
}
sem_post(&m); // V(m)

free(i);
}

int main() {
sem_init(&w,0,1);
sem_init(&m,0,1);

printf("Enter count of writers:");
scanf("%d",&writersCount);
printf("Enter count of readers:");
scanf("%d",&readersCount);

for (i=0; i<readersCount; i++) {
int *arg = malloc(sizeof(*arg));
*arg = i;
pthread_create(&readersThread[i], NULL, reader, arg);
}
for (i=0; i<writersCount; i++) {
int *arg = malloc(sizeof(*arg));
*arg = i;
pthread_create(&writersThread[i], NULL, writer, arg);
}
for (i=0; i<writersCount; i++) {
pthread_join(writersThread[i], NULL);
}
for (i=0; i<readersCount; i++) {
pthread_join(readersThread[i], NULL);
}

printf("--------------\n");
for (i=0; i<readersCount; i++) {
printf("Reader %d read %d times\n",i+1,readCount[i+1]);
}

for (i=0; i<writersCount; i++) {
printf("Writer %d wrote %d times\n",i+1,writeCount[i+1]);
}

sem_destroy(&w);
sem_destroy(&m);
return 0;
}

输出: 输入作者数:4 输入读者数:4

Reader 1 reads from DB.
Reader 3 reads from DB.
Reader 4 reads from DB.
Reader 2 reads from DB.
Writer 1 writes to DB.
Writer 2 writes to DB.
Writer 3 writes to DB.
Writer 4 writes to DB.
--------------
Reader 1 read 1 times
Reader 2 read 1 times
Reader 3 read 1 times
Reader 4 read 1 times
Writer 1 wrote 1 times
Writer 2 wrote 1 times
Writer 3 wrote 1 times
Writer 4 wrote 1 times

最佳答案

您的输出是完全正确的,因为您运行的每个线程都只执行一次读/写。在读写器函数中放置一些循环来改变这个事实。当您使用 10 个读取器或写入器运行程序时,您的程序可能会遇到错误,因为其中一个将尝试访问 writeCount[10]readCount[10],更改它并你有一个正确的程序。

关于c - 读者 - C 语言的作者 - 我哪里错了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27932070/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com