-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtemplate.txt
142 lines (104 loc) · 2.9 KB
/
template.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
typedef struct buffer{
int* data;
int index;
int kapacita;
pthread_mutex_t* mutex;
} BUFFER;
typedef struct producentData{
BUFFER* buffer;
pthread_cond_t* plno;
pthread_cond_t* prazdno;
} PRODUCENTDATA;
typedef struct konzumentData{
BUFFER* buffer;
pthread_cond_t* plno;
pthread_cond_t* prazdno;
} KONZUMENTDATA;
void* producent(void* data){
PRODUCENTDATA* d = (PRODUCENTDATA*)data;
printf("Zaciatok vlakna producent!\n");
for (int i = 0; i < 20; ++i) {
pthread_mutex_lock(d->buffer->mutex);
while(d->buffer->index >= d->buffer->kapacita){
printf("Cakanie na uvolnenie bufferu!\n");
pthread_cond_wait(d->prazdno, d->buffer->mutex);
}
printf("Vkladanie do bufferu!\n");
usleep(3000);
d->buffer->data[d->buffer->index] = 1;
d->buffer->index++;
pthread_cond_broadcast(d->plno);
pthread_mutex_unlock(d->buffer->mutex);
}
printf("Koniec vlakna producent!\n");
}
void* konzument(void* data){
KONZUMENTDATA* d = (KONZUMENTDATA*)data;
printf("Zaciatok vlakna konzument!\n");
for (int i = 0; i < 20; ++i) {
pthread_mutex_lock(d->buffer->mutex);
while(d->buffer->index <= 0){
printf("Cakanie na zaplnenie bufferu!\n");
pthread_cond_wait(d->plno, d->buffer->mutex);
}
printf("Vyberanie z bufferu!\n");
usleep(3000);
int cislo = d->buffer->data[d->buffer->index - 1];
d->buffer->index--;
pthread_cond_broadcast(d->prazdno);
pthread_mutex_unlock(d->buffer->mutex);
}
printf("Koniec vlakna konzument!\n");
}
int main(int argc, char** argv) {
srand(time(NULL));
printf("Zaciatok programu!\n");
int n;
if(argc == 2){
n = atoi(argv[1]);
} else {
n = 10;
}
pthread_mutex_t mutex;
pthread_mutex_init(&mutex, NULL);
pthread_cond_t plno;
pthread_cond_t prazdno;
pthread_cond_init(&plno, NULL);
pthread_cond_init(&prazdno, NULL);
int* data = malloc(sizeof (int) * 5);
BUFFER buffer = {
data,
0,
10,
&mutex
};
//Producent
PRODUCENTDATA pd = {
&buffer,
&plno,
&prazdno
};
pthread_t producent_vlakno;
pthread_create(&producent_vlakno, NULL, &producent, &pd);
//Konzument
KONZUMENTDATA kd = {
&buffer,
&plno,
&prazdno
};
pthread_t konzument_vlakno;
pthread_create(&konzument_vlakno, NULL, &konzument, &kd);
//Spojenie vlakien
pthread_join(producent_vlakno, NULL);
pthread_join(konzument_vlakno, NULL);
//Cistenie pamate
free(data);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&plno);
pthread_cond_destroy(&prazdno);
return 0;
}