SHOW:
|
|
- or go back to the newest paste.
1 | #include <stdio.h> | |
2 | #include <stdlib.h> | |
3 | #include <semaphore.h> | |
4 | #include <pthread.h> | |
5 | ||
6 | - | #define NUMBER_OF_AWESOMENESS 2 |
6 | + | #define NUMBER_OF_AWESOMENESS 100 |
7 | - | #define SIZE 10 |
7 | + | #define SIZE 1000 |
8 | ||
9 | void *consume(void*); | |
10 | void *produce(void*); | |
11 | ||
12 | typedef struct { | |
13 | sem_t full; | |
14 | sem_t empty; | |
15 | sem_t mutex; | |
16 | int buffer; | |
17 | } arguments; | |
18 | ||
19 | int main(int argc, char ** argv) | |
20 | { | |
21 | - | arguments args; |
21 | + | arguments *args; |
22 | ||
23 | - | args.buffer = 0; |
23 | + | args = malloc (sizeof args); |
24 | ||
25 | - | sem_init(&args.full, 0, 0); |
25 | + | args->buffer = 0; |
26 | - | sem_init(&args.empty, 0, SIZE); |
26 | + | sem_init(&args->full, 0, 0); |
27 | - | sem_init(&args.mutex,0, 1); |
27 | + | sem_init(&args->empty, 0, SIZE); |
28 | sem_init(&args->mutex,0, 1); | |
29 | ||
30 | pthread_t consumers[NUMBER_OF_AWESOMENESS]; | |
31 | pthread_t producers[NUMBER_OF_AWESOMENESS]; | |
32 | ||
33 | - | pthread_create(&consumers[i], NULL, consume, (void*) &args); |
33 | + | |
34 | - | pthread_create(&producers[i], NULL, produce, (void*) &args); |
34 | + | pthread_create(&consumers[i], NULL, consume, (void*) args); |
35 | pthread_create(&producers[i], NULL, produce, (void*) args); | |
36 | } | |
37 | ||
38 | for (int i = 0; i <= NUMBER_OF_AWESOMENESS; ++i) { | |
39 | pthread_join(consumers[i], NULL); | |
40 | pthread_join(producers[i], NULL); | |
41 | } | |
42 | ||
43 | exit(EXIT_SUCCESS); | |
44 | } | |
45 | ||
46 | void* consume(void *arg) | |
47 | { | |
48 | arguments* args = (arguments *) arg; | |
49 | ||
50 | while (1) { | |
51 | sem_wait(&args->full); | |
52 | sem_wait(&args->mutex); | |
53 | args->buffer--; | |
54 | printf("\nConsume: \t %d", args->buffer); | |
55 | sem_post(&args->mutex); | |
56 | sem_post(&args->empty); | |
57 | } | |
58 | return NULL; | |
59 | } | |
60 | ||
61 | void* produce(void *arg) | |
62 | { | |
63 | arguments* args = (arguments *) arg; | |
64 | ||
65 | while (1) { | |
66 | sem_wait(&args->empty); | |
67 | sem_wait(&args->mutex); | |
68 | args->buffer++; | |
69 | printf("\nProduce: \t %d", args->buffer); | |
70 | sem_post(&args->mutex); | |
71 | sem_post(&args->full); | |
72 | } | |
73 | return NULL; | |
74 | } |