c - 使用 pthread 和信号量的 C 语言中的读写器问题
问题描述
我正在尝试通过 C 代码创建读者-作者场景,但我一直试图在中间中断读者代码,以便读者不只是进入和退出,它会留下来并且可以添加更多读者。
我目前的程序不进入多个读者,一个进入,它就会离开,然后作家就会来。
我试过使用 sleep() 但包含 unistd 库确实会破坏一半的代码并出现错误
#include<semaphore.h>
#include<stdio.h>
#include<stdlib.h>
sem_t x,y;
pthread_t tid;
pthread_t writerthreads[100],readerthreads[100];
int readercount;
void *reader(void* param)
{
sem_wait(&x);
readercount++;
if(readercount==1)
sem_wait(&y);
sem_post(&x);
printf("\n%d reader is inside",readercount);
sem_wait(&x);
readercount--;
if(readercount==0)
{
sem_post(&y);
}
sem_post(&x);
printf("\n%d Reader is leaving",readercount+1);
}
void *writer(void* param)
{
printf("\nWriter is trying to enter");
sem_wait(&y);
printf("\nWriter has entered");
sem_post(&y);
printf("\nWriter is leaving");
}
int main()
{
int n2,i;
printf("Enter the number of readers:");
scanf("%d",&n2);
int n1[n2];
sem_init(&x,0,1);
sem_init(&y,0,1);
for(i=0;i<n2;i++)
{
pthread_create(&writerthreads[i],NULL,reader,NULL);
pthread_create(&readerthreads[i],NULL,writer,NULL);
}
for(i=0;i<n2;i++)
{
pthread_join(writerthreads[i],NULL);
pthread_join(readerthreads[i],NULL);
}
}
输出形式为
reader is inside
reader is leaving
reader is inside
reader is leaving
writer is trying to enter
writer has entered
writer is leaving
等等,我希望程序中一次有多个读者。
解决方案
您的代码工作正常。只需给阅读器添加一点延迟,就可以让其他阅读时间进入。否则,阅读器完成得太快,很少看到重叠的阅读器。您还忘记了初始化readercount
为零。
#include<semaphore.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
sem_t x,y;
pthread_t tid;
pthread_t writerthreads[100],readerthreads[100];
int readercount = 0;
void *reader(void* param)
{
sem_wait(&x);
readercount++;
if(readercount==1)
sem_wait(&y);
sem_post(&x);
printf("%d reader is inside\n",readercount);
usleep(3);
sem_wait(&x);
readercount--;
if(readercount==0)
{
sem_post(&y);
}
sem_post(&x);
printf("%d Reader is leaving\n",readercount+1);
return NULL;
}
void *writer(void* param)
{
printf("Writer is trying to enter\n");
sem_wait(&y);
printf("Writer has entered\n");
sem_post(&y);
printf("Writer is leaving\n");
return NULL;
}
int main()
{
int n2,i;
printf("Enter the number of readers:");
scanf("%d",&n2);
printf("\n");
int n1[n2];
sem_init(&x,0,1);
sem_init(&y,0,1);
for(i=0;i<n2;i++)
{
pthread_create(&writerthreads[i],NULL,reader,NULL);
pthread_create(&readerthreads[i],NULL,writer,NULL);
}
for(i=0;i<n2;i++)
{
pthread_join(writerthreads[i],NULL);
pthread_join(readerthreads[i],NULL);
}
}
1 个读者在里面
作家正在尝试进入
2 读者在里面
2 读者正在离开
2 读者在里面
作家正在尝试进入
2 读者正在离开
1 读者正在离开
推荐阅读
- angular - 带参数的角度 10 路由和导航错误
- xamarin - Xamarin.Forms.Maps 未显示在已安装的包下
- python - 在while条件下的evey循环后将数据框附加到excel
- reactjs - 路径存储在 React 变量中时无法渲染图像
- sql-server - 在 SQL Server 表中的 Join 和 Groupby 之后转置行
- javascript - 如何在同一类的 html 中多次使用相同的函数?
- android - 如何在颤动中禁用地图框中的手势?
- javascript - 我正在尝试使用画布在 javascript 中可视化排序算法?
- xcode - 将实体添加到 Core Data 模型会阻止 Canvas Preview 显示
- python - 如何从字典键中获取值?