Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rdemeter
GitHub Repository: rdemeter/so
Path: blob/master/lab9/readerwriter.c
221 views
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <unistd.h>
4
#include <time.h>
5
#include <pthread.h>
6
7
#include <semaphore.h>
8
#define DATA_LENGTH 20
9
#define NR_WRITER 5
10
#define NR_READER 10
11
char buffers[DATA_LENGTH];
12
void *writer(void* arg)
13
{
14
int i, writePt = 0;
15
char data;
16
for(i=0; i < DATA_LENGTH; i++)
17
{
18
printf("writing#%ld\n", (long) arg);
19
data = 'A' + rand() % 25;
20
buffers[writePt] = data;
21
sleep(rand() % 5);
22
printf("write#%ld: buffer[%d]=%c\n", (long) arg, writePt, data);
23
writePt = (writePt + 1);
24
}
25
}
26
27
void* reader(void* arg)
28
{
29
int i, readPt = 0;
30
char data;
31
for(i=0; i < DATA_LENGTH; i++)
32
{
33
printf("\t\treading#%ld\n", (long) arg);
34
sleep(rand()%3);
35
data = buffers[readPt];
36
printf("\t\tread#%ld: buffer[%d]=%c\n", (long) arg, readPt, data);
37
readPt = (readPt + 1);
38
}
39
}
40
41
int main(void)
42
{
43
long i;
44
pthread_t wrt[NR_WRITER], rd[NR_READER];
45
for(i = 0; i < NR_WRITER; i++)
46
pthread_create(&wrt[i], NULL, writer, (void*) i);
47
for(i = 0; i < NR_READER; i++)
48
pthread_create(&rd[i], NULL, reader, (void*) i);
49
for(i = 0; i < NR_WRITER; i++)
50
pthread_join(wrt[i], NULL);
51
for(i = 0; i < NR_READER; i++)
52
pthread_join(rd[i], NULL);
53
printf("done!\n");
54
return 0;
55
}
56
57