home *** CD-ROM | disk | FTP | other *** search
/ ftp.disi.unige.it / 2015-02-11.ftp.disi.unige.it.tar / ftp.disi.unige.it / pub / .person / GianuzziV / SO1 / buffer.c next >
C/C++ Source or Header  |  2001-11-11  |  2KB  |  74 lines

  1. /* file:  buffer.c
  2.    gcc -D_REENTRANT buffer.c -lpthread
  3.  
  4.    lettore / scrittore con un singolo scrittore e un singolo lettore.
  5.    Il buffer condiviso e' fomato da un solo item il cui accesso e'
  6.    controllato da un mutex.
  7. */
  8.  
  9. #include <stdio.h>
  10. #include <pthread.h>
  11.  
  12.   void reader_function(void);
  13.   void writer_function(void);
  14.   char make_new_item();
  15.   void consume_item( char ch );
  16.  
  17.   char buffer;
  18.   int buffer_has_item = 0;
  19.   pthread_mutex_t mutex;
  20.   struct timespec delay;
  21.  
  22.   main()
  23.   {
  24.      pthread_t reader;
  25.  
  26.      pthread_mutex_init(&mutex, NULL);
  27.      pthread_create( &reader, NULL, (void*)&reader_function,
  28.                     NULL);
  29.      writer_function();
  30.   }
  31.  
  32.   char make_new_item()
  33.   {
  34.      char ch1, ch2;
  35.      printf("inserisci un carattere > ");
  36.      scanf("%c", &ch1);
  37.      scanf("%c", &ch2);  /* legge il return */
  38.      return ch1;
  39.   }
  40.  
  41.   void consume_item (char ch)
  42.   {
  43.      printf("Il reader ha letto %c\n", ch);
  44.   }
  45.  
  46.   void writer_function(void)
  47.   {
  48.      while(1)
  49.      {
  50.           pthread_mutex_lock( &mutex );
  51.           if ( buffer_has_item == 0 )
  52.           {
  53.                buffer = make_new_item();
  54.                buffer_has_item = 1;
  55.           }
  56.           pthread_mutex_unlock( &mutex );
  57.      }
  58.   }
  59.  
  60.   void reader_function(void)
  61.   {
  62.      while(1)
  63.      {
  64.           pthread_mutex_lock( &mutex );
  65.           if ( buffer_has_item == 1)
  66.           {
  67.                consume_item( buffer );
  68.                buffer_has_item = 0;
  69.           }
  70.           pthread_mutex_unlock( &mutex );
  71.      }
  72.   }
  73.  
  74.