3
3
#include <stdio.h>
4
4
#include <stdlib.h>
5
5
#include <time.h>
6
- // #include <unistd.h>
7
- // #include "queue.h"
8
6
9
7
#define QUEUE_SIZE 4
10
8
#define CLIENTS_AMOUNT 10
11
9
12
10
#define MAX_RAND_INT 100
13
11
#define MIN_RAND_INT 0
14
12
15
- int getRandom ()
16
- {
17
- return rand () % (MAX_RAND_INT - MIN_RAND_INT ) + MIN_RAND_INT ;
18
- }
19
-
20
- // Queue* q = new Queue();
21
-
22
13
int queue [QUEUE_SIZE ];
23
14
int pointer ;
15
+
24
16
sem_t online_clients ;
25
17
int online_clients_value ;
26
18
pthread_mutex_t queue_locker ;
27
19
pthread_mutex_t sem_value_locker ;
28
20
pthread_t clients [CLIENTS_AMOUNT ];
29
21
pthread_t barber ;
22
+
30
23
int done_clients = 0 ;
31
24
25
+ int getRandom ()
26
+ {
27
+ return rand () % (MAX_RAND_INT - MIN_RAND_INT ) + MIN_RAND_INT ;
28
+ }
29
+
32
30
void * barber_worker (void * args )
33
31
{
34
32
printf ("Barber is starting work...\n" );
35
33
while (1 )
36
34
{
37
- printf ("Barber is waiting for clients...\n" );
35
+ printf ("Barber is waiting for clients, queue size: %d...\n" , pointer + 1 );
36
+
38
37
sem_wait (& online_clients );
39
38
40
39
printf ("Barber got new client...\n" );
@@ -47,51 +46,45 @@ void* barber_worker(void* args)
47
46
48
47
sleep (getRandom () % 3 );
49
48
}
50
-
51
- return NULL ;
52
49
}
53
50
54
51
void * client (void * args )
55
52
{
56
- short num = (short )args ;
57
- sleep (getRandom () % 3 );
53
+ int num = (int )args ;
54
+ sleep (getRandom () % 5 );
58
55
int online = 0 ;
59
56
60
57
printf ("Client%d created\n" , num );
61
58
62
59
pthread_mutex_lock (& sem_value_locker );
60
+ printf ("Client%d getting value of online clients\n" , num );
61
+ sem_getvalue (& online_clients , & online_clients_value );
62
+ online = online_clients_value ;
63
63
64
- printf ( "Client%d getting value of online clients\n" , num );
65
-
66
- sem_getvalue ( & online_clients , & online_clients_value );
67
- online = online_clients_value ;
64
+ if ( online < QUEUE_SIZE ) {
65
+ pthread_mutex_lock ( & queue_locker );
66
+ printf ( "Client%d will be on chair now...\n" , num );
67
+ sem_post ( & online_clients ) ;
68
68
69
- if (online < QUEUE_SIZE ) {
70
- printf ("Client%d will be on chair now...\n" , num );
71
- sem_post (& online_clients );
72
-
73
- pthread_mutex_lock (& queue_locker );
74
- queue [pointer ++ ] = num ;
75
- printf ("Client%d in queue...\n" , num );
76
- printf ("Queue size: %d\n" , pointer + 1 );
77
- pthread_mutex_unlock (& queue_locker );
78
- }
69
+ queue [pointer ++ ] = num ;
70
+ printf ("Client%d in queue...\n" , num );
71
+ printf ("Queue size: %d\n" , pointer + 1 );
72
+ pthread_mutex_unlock (& queue_locker );
73
+ }
79
74
80
75
pthread_mutex_unlock (& sem_value_locker );
81
-
82
- return NULL ;
83
76
}
84
77
85
78
int main () {
86
79
int i ;
87
- pointer = 0 ;
80
+ pointer = -1 ;
88
81
89
82
sem_init (& online_clients , 0 , 0 );
90
83
pthread_mutex_init (& queue_locker , NULL );
91
84
92
85
pthread_create (& barber , NULL , barber_worker , NULL );
93
86
94
- for (i = 0 ; i < 10 ; ++ i )
87
+ for (i = 0 ; i < 20 ; ++ i )
95
88
{
96
89
pthread_create (& (clients [i ]), NULL , client , (void * )i );
97
90
}
0 commit comments