Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rdemeter
GitHub Repository: rdemeter/so
Path: blob/master/lab9/readerwriter2.c
221 views
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <unistd.h>
4
#include <time.h>
5
#include <pthread.h>
6
#include <semaphore.h>
7
8
#define DATA_LENGTH 20
9
#define NR_WRITER 5
10
#define NR_READER 10
11
12
char buffers[DATA_LENGTH];
13
pthread_mutex_t mutex;
14
pthread_mutex_t db;
15
int rc = 0;
16
17
void *writer(void* arg)
18
{
19
int i, writePt = 0;
20
char data;
21
22
for(i=0; i < DATA_LENGTH; i++)
23
{
24
pthread_mutex_lock(&db);
25
printf("writing#%ld\n", (long) arg);
26
data = 'A' + rand() % 25;
27
buffers[writePt] = data;
28
sleep(rand()%5);
29
printf("write#%ld: buffer[%d]=%c\n", (long) arg, writePt, data);
30
writePt = (writePt + 1);
31
pthread_mutex_unlock(&db);
32
}
33
}
34
35
void* reader(void* arg)
36
{
37
int i, readPt = 0;
38
char data;
39
40
for(i=0; i < DATA_LENGTH; i++)
41
{
42
pthread_mutex_lock(&mutex);
43
rc = rc + 1;
44
if(rc == 1) pthread_mutex_lock(&db);
45
pthread_mutex_unlock(&mutex);
46
printf("\t\treading#%ld\n", (long) arg);
47
sleep(rand()%3);
48
data = buffers[readPt];
49
printf("\t\tread#%ld: buffer[%d]=%c\n", (long) arg, readPt, data);
50
readPt = (readPt + 1);
51
pthread_mutex_lock(&mutex);
52
rc = rc - 1;
53
if(rc == 0) pthread_mutex_unlock(&db);
54
pthread_mutex_unlock(&mutex);
55
}
56
}
57
58
int main(void)
59
{
60
long i;
61
pthread_t wrt[NR_WRITER], rd[NR_READER];
62
63
pthread_mutex_init(&mutex, NULL);
64
pthread_mutex_init(&db, NULL);
65
66
for(i = 0; i < NR_WRITER; i++)
67
pthread_create(&wrt[i], NULL, writer, (void*) i);
68
for(i = 0; i < NR_READER; i++)
69
pthread_create(&rd[i], NULL, reader, (void*) i);
70
71
for(i = 0; i < NR_WRITER; i++)
72
pthread_join(wrt[i], NULL);
73
for(i = 0; i < NR_READER; i++)
74
pthread_join(rd[i], NULL);
75
76
pthread_mutex_destroy(&mutex);
77
pthread_mutex_destroy(&db);
78
79
printf("done!\n");
80
return 0;
81
}
82
83