fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pthread.h>
  4. #include <semaphore.h>
  5. #define BSIZE 5
  6.  
  7.  
  8. int buffer[BSIZE];
  9. int in = 0;
  10. int out = 0;
  11. int produced_count=0;
  12. int consumed_count=0;
  13.  
  14. sem_t mutex_lock;
  15. sem_t full_slots;
  16. sem_t empty_slots;
  17.  
  18.  
  19. void* produce(){
  20.  
  21. while(1){
  22.  
  23. int new_stuff=rand()%100;
  24.  
  25. sem_wait(&empty_slots);
  26. sem_wait(&mutex_lock);
  27. buffer[in]=new_stuff;
  28.  
  29. printf("\nproduct number %d produced",new_stuff);
  30. in=(in+1)%BSIZE;
  31.  
  32. sem_post(&mutex_lock);
  33. sem_post(&full_slots);
  34.  
  35.  
  36. }
  37. pthread_exit(NULL);
  38. }
  39.  
  40. void* consume(){
  41.  
  42. while(1){
  43.  
  44. sem_wait(&full_slots);
  45. sem_wait(&mutex_lock);
  46. int consumed=buffer[out];
  47. printf("\nproduct number %d consumed",consumed);
  48. out=(out+1)%BSIZE;
  49.  
  50. sem_post(&mutex_lock);
  51. sem_post(&empty_slots);
  52.  
  53. }
  54.  
  55. pthread_exit(NULL);
  56. }
  57.  
  58.  
  59. int main(){
  60. int p=0;int c=0;
  61. int n=0,m=0;
  62. printf("\nenter number of producers: ");
  63. scanf("%d",&n);
  64. printf("\nenter number of consumers: ");
  65. scanf("%d",&m);
  66.  
  67. pthread_t producer[n];
  68. pthread_t consumer[m];
  69.  
  70. sem_init(&mutex_lock, 0, 1);
  71. sem_init(&full_slots, 0, 0);
  72. sem_init(&empty_slots, 0, BSIZE);
  73.  
  74. for(int i=0;i<n;i++)
  75. p=pthread_create(&producer[i], NULL, produce, NULL);
  76.  
  77. for(int i =0;i<m;i++)
  78. c=pthread_create(&consumer[i], NULL, consume, NULL);
  79.  
  80. for(int i=0;i<n;i++)
  81. pthread_join(producer[i],NULL);
  82.  
  83. for(int i =0;i<m;i++)
  84. pthread_join(consumer[i],NULL);
  85.  
  86. sem_destroy(&mutex_lock);
  87. sem_destroy(&full_slots);
  88. sem_destroy(&empty_slots);
  89.  
  90. }
Success #stdin #stdout 0.01s 5304KB
stdin
Standard input is empty
stdout
product number 83 produced
product number 86 produced
product number 77 produced
product number 15 produced
product number 93 produced
product number 83 consumed
product number 86 consumed
product number 77 consumed
product number 15 consumed
product number 93 consumed
product number 35 produced
product number 86 produced
product number 35 consumed
product number 86 consumed