#include <stdio.h>
#include <semaphore.h>
#include <pthread.h>
#include <stdlib.h>
#include <sched.h>
sem_t r_w_w;
sem_t mutex;
int readCount=0;
char info[80];
int Reader(int *r_n)
{
int j=0;
char rc[80];
while(j<10){j++;
sleep(*r_n+2);
sem_wait(&mutex);
readCount++;
if(readCount==1)
{
sem_wait(&r_w_w);
printf("First reader(%d) has intered the CR!\n",*r_n);
}
sem_post(&mutex);
sleep(*r_n+5);
printf("The %dth(/%d) reader is reading:",*r_n,readCount);
strcpy(rc,info);
printf("%s\n",rc);
sem_wait(&mutex);
readCount--;
if(readCount==0)
sem_post(&r_w_w);
printf("The %dth reader exit.\n",*r_n);
sem_post(&mutex);
}
}
int Writer(int *w_n)
{
char ws[80];
int j=0;
sprintf(ws,"The information that the %dth writer writes is read",*w_n);
while(j<10){j++;
sleep(*w_n+1);
sem_wait(&r_w_w);
strcpy(info,ws);
sem_post(&r_w_w);
}
}
main(){
int i,arg;
int clone_flag;
char *stack;
sem_init(&r_w_w,0,1);
sem_init(&mutex,0,1);
clone_flag=CLONE_VM|CLONE_SIGHAND |CLONE_FS|CLONE_FILES;
for(i=0;i<4;i++){
arg=i+1;
stack=(char *) malloc(4096);
clone((void *)Writer,&(stack[4096]),
clone_flag,(void *)&arg);
}
sleep(5);
for(i=0;i<4;i++){
arg=i+1;
stack=(char *) malloc(4096);
clone((void *)Reader,&(stack[4096]),
clone_flag,(void *)&arg);
}
exit(1);
}
#include <semaphore.h>
#include <pthread.h>
#include <stdlib.h>
#include <sched.h>
sem_t r_w_w;
sem_t mutex;
int readCount=0;
char info[80];
int Reader(int *r_n)
{
int j=0;
char rc[80];
while(j<10){j++;
sleep(*r_n+2);
sem_wait(&mutex);
readCount++;
if(readCount==1)
{
sem_wait(&r_w_w);
printf("First reader(%d) has intered the CR!\n",*r_n);
}
sem_post(&mutex);
sleep(*r_n+5);
printf("The %dth(/%d) reader is reading:",*r_n,readCount);
strcpy(rc,info);
printf("%s\n",rc);
sem_wait(&mutex);
readCount--;
if(readCount==0)
sem_post(&r_w_w);
printf("The %dth reader exit.\n",*r_n);
sem_post(&mutex);
}
}
int Writer(int *w_n)
{
char ws[80];
int j=0;
sprintf(ws,"The information that the %dth writer writes is read",*w_n);
while(j<10){j++;
sleep(*w_n+1);
sem_wait(&r_w_w);
strcpy(info,ws);
sem_post(&r_w_w);
}
}
main(){
int i,arg;
int clone_flag;
char *stack;
sem_init(&r_w_w,0,1);
sem_init(&mutex,0,1);
clone_flag=CLONE_VM|CLONE_SIGHAND |CLONE_FS|CLONE_FILES;
for(i=0;i<4;i++){
arg=i+1;
stack=(char *) malloc(4096);
clone((void *)Writer,&(stack[4096]),
clone_flag,(void *)&arg);
}
sleep(5);
for(i=0;i<4;i++){
arg=i+1;
stack=(char *) malloc(4096);
clone((void *)Reader,&(stack[4096]),
clone_flag,(void *)&arg);
}
exit(1);
}