Guest User

Untitled

a guest
Feb 21st, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.82 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <pthread.h>
  4.  
  5. void *pfunct(void *_tbuffer);
  6. void *cfunct(void *_tbuffer);
  7.  
  8. pthread_mutex_t ptmutex;
  9. pthread_cond_t ptcond;
  10. pthread_attr_t tattr;
  11.  
  12. struct thrbuff{
  13.         int buffer1[128];
  14.         int buffer1index;
  15.         int prodcomplete;
  16. };
  17. struct thrbuff tbuffer;
  18.  
  19.  
  20. int main() {
  21.         pthread_t producer,  consumer;
  22.  
  23.         pthread_attr_init(&tattr);
  24.         pthread_attr_setschedpolicy(&tattr, SCHED_FIFO);
  25.         pthread_mutex_init(&ptmutex, NULL);
  26.         pthread_cond_init(&ptcond, NULL);
  27.  
  28.         tbuffer.buffer1index=1;
  29.         tbuffer.prodcomplete=0;
  30.  
  31.         pthread_create(&producer, &tattr, pfunct, &tbuffer);
  32.         pthread_create(&consumer, &tattr, cfunct, &tbuffer);
  33.  
  34.         pthread_join(producer, NULL);
  35.         pthread_join(consumer, NULL);
  36.  
  37.  
  38.         return 0;
  39. }
  40.  
  41. void *pfunct(void *_tbuffer){
  42.         int i=0;
  43.         struct thrbuff *tbuffer=_tbuffer;
  44.  
  45.  
  46.         while(i < 1024){
  47.                 pthread_mutex_lock(&ptmutex);
  48.                 if(tbuffer->buffer1index > 0 && tbuffer->buffer1index < 128){
  49.                         tbuffer->buffer1[tbuffer->buffer1index] = i;
  50.                         printf("producer - tbuffer->buffer1index is %d - i is %d - tbuffer->buffer1[tbuffer->buffer1index] is %d\n", tbuffer->buffer1index, i, tbuffer->buffer1[tbuffer->buffer1index]);
  51.                         tbuffer->buffer1index++;
  52.                         i++;
  53.                         pthread_cond_signal(&ptcond);
  54.                 }
  55.                 else{
  56.                         pthread_cond_signal(&ptcond);
  57.                         pthread_cond_wait(&ptcond, &ptmutex);
  58.                 }
  59.                 pthread_mutex_unlock(&ptmutex);
  60.         }
  61.  
  62.         tbuffer->prodcomplete=1;
  63.         pthread_cond_signal(&ptcond);
  64.         return 0;
  65. }
  66.  
  67. void *cfunct(void *_tbuffer){
  68.         struct thrbuff *tbuffer=_tbuffer;
  69.  
  70.         while(!pthread_mutex_lock(&ptmutex) && (tbuffer->prodcomplete == 0 || tbuffer->buffer1index)){
  71.                 if(tbuffer->buffer1index > 0){
  72.                         tbuffer->buffer1index--;
  73.                         printf("consumer - tbuffer->buffer1[tbuffer->buffer1index] is %d\n", tbuffer->buffer1[tbuffer->buffer1index]);
  74.                         pthread_cond_signal(&ptcond);
  75.                         pthread_mutex_unlock(&ptmutex);
  76.                         sleep(1);
  77.                 }
  78.                 else{
  79.                         //printf("consumer while tbuffer->prodcomplete=0, if tbuffer->buffer1index else\n");
  80.                         pthread_cond_signal(&ptcond);
  81.                         pthread_cond_wait(&ptcond, &ptmutex);
  82.                         pthread_mutex_unlock(&ptmutex);
  83.                 }
  84.         }
  85.         printf("prodcomplete == 1\n");
  86.         pthread_cond_signal(&ptcond);
  87.         return 0;
  88. }
Add Comment
Please, Sign In to add comment