【发布时间】:2014-05-30 11:05:54
【问题描述】:
我在 C 中遇到了读写器问题。谁能解释一下下面代码中发生了什么。我不明白 pthread_create(&tid,NULL,writer,NULL) 行之后的执行流程。
#include<pthread.h>
//#include<semaphore.h>
#include<stdio.h>
#include<stdlib.h>
pthread_mutex_t x,wsem;
pthread_t tid;
int readcount;
void intialize()
{
pthread_mutex_init(&x,NULL);
pthread_mutex_init(&wsem,NULL);
readcount=0;
}
void * reader (void * param)
{
int waittime;
waittime = rand() % 5;
printf("\nReader is trying to enter");
pthread_mutex_lock(&x);
readcount++;
if(readcount==1)
pthread_mutex_lock(&wsem);
printf("\n%d Reader is inside ",readcount);
pthread_mutex_unlock(&x);
sleep(waittime);
pthread_mutex_lock(&x);
readcount--;
if(readcount==0)
pthread_mutex_unlock(&wsem);
pthread_mutex_unlock(&x);
printf("\nReader is Leaving");
}
void * writer (void * param)
{
int waittime;
waittime=rand() % 3;
printf("\nWriter is trying to enter");
pthread_mutex_lock(&wsem);
printf("\nWrite has entered");
sleep(waittime);
pthread_mutex_unlock(&wsem);
printf("\nWriter is leaving");
sleep(30);
exit(0);
}
int main()
{
int n1,n2,i;
printf("\nEnter the no of readers: ");
scanf("%d",&n1);
printf("\nEnter the no of writers: ");
scanf("%d",&n2);
for(i=0;i<n1;i++)
pthread_create(&tid,NULL,reader,NULL);
for(i=0;i<n2;i++)
pthread_create(&tid,NULL,writer,NULL);
sleep(30);
exit(0);
}
【问题讨论】:
-
您不会调用
initialize()函数来初始化互斥锁。 -
在
main()内,您不调用函数initialize()。这是初始化两个互斥锁x和wsem的函数。 -
你需要先了解什么是读写器问题,然后跳转到代码。
-
@DaV 抱歉,我忘了在 main() 中调用 initialize()。我在执行上述代码时没有任何问题,你能解释一下 sleep() 之后发生了什么我关心阅读器函数中 sleep 语句后的执行流程,请帮助
-
@brokenfoot 我知道读写器问题是什么,但我不知道如何使用信号量和 pthread 为读写器编写 C 代码,所以如果你向我解释一下线程并解释一下上面代码在 reader 函数中的 sleep 语句之后的执行流程。