View difference between Paste ID: 2Q5GQGhS and 7XLWUUPT
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
}