Advertisement
Guest User

Untitled

a guest
Nov 28th, 2014
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <semaphore.h>
  4. #include <pthread.h>
  5.  
  6. #define NUMBER_OF_AWESOMENESS 100
  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;
  22.  
  23.    args = malloc (sizeof args);
  24.  
  25.    args->buffer = 0;
  26.    sem_init(&args->full, 0, 0);
  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.    for (int i = 0; i <= NUMBER_OF_AWESOMENESS; ++i) {
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement