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 / thread.c < prev    next >
C/C++ Source or Header  |  2005-03-20  |  3KB  |  140 lines

  1. #include <pthread.h>
  2. #include <sys/types.h>
  3. #include <stdio.h>
  4. #include <sys/stat.h>
  5. #include <fcntl.h>
  6. #include <unistd.h>
  7. #include <sys/times.h>
  8.  
  9. /********************************************************
  10. *  file thread.c                                        *
  11. *  legge 10 volte dei blocchi da 10 MB dal file         *
  12. *  mega.dat (deve gia'esistere) usando due buffer di    *
  13. *  memoria da 1MB ciascuno e 2 thread che leggono e     *
  14. *  calcolano  in interleaving.                          *
  15. *  Scrive i tempi.                                      *
  16. *                                                       *
  17. *  gcc -D_REENTRANT thread.c -o thread.exe -lpthread    *
  18. *********************************************************/
  19.  
  20. int   fd, valC, valD;
  21. char  buffer[2][10000000]; 
  22. int   ini[10], fin[10], calc[10], calcini[10];
  23.  
  24. clock_t t1, t2;
  25. struct tms buf;
  26.  
  27. pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
  28. pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  29. int flag=0;
  30.  
  31. pthread_t  reader;
  32. pthread_t  eval;
  33.  
  34. void reader_function(void);
  35. void eval_function(void);
  36.  
  37. main ()
  38. {
  39.   int i;
  40.  
  41.   t1=times(&buf);
  42.   printf("valore times %d\n", t1);
  43.   fd=open("mega.dat", O_RDONLY);
  44.  
  45.   ini[0]=times(&buf);
  46.   read(fd, &buffer[0][0], (sizeof(buffer[0])/2));
  47.   fin[0]=times(&buf);
  48.   printf("reader 0,  inizio %d,  fine %d,  tot %d\n", 
  49.           ini[0], fin[0], fin[0]-ini[0]);
  50.   
  51.   pthread_create(&reader, NULL, (void*)&reader_function, NULL);
  52.   pthread_create(&eval, NULL, (void*)&eval_function, NULL);
  53.  
  54.   pthread_join(reader, NULL);
  55.   pthread_join(eval, NULL);
  56.  
  57.   t2=times(&buf);
  58.   printf("fine times %d\n", t2);
  59.   printf("times totale %d\n", t2-t1);
  60.  
  61.   valD=0;
  62.   for (i=0; i<10; i++)
  63.     valD=valD+fin[i]-ini[i];
  64.   valC=0;
  65.   for (i=0; i<10; i++)
  66.     valC=valC+calc[i]-calcini[i];
  67.  
  68.   printf("tempo lettura disco %d,    tempo calcolo %d\n", valD, valC);
  69. }
  70.  
  71. void reader_function(void)
  72. {
  73.   int i, start;
  74.  
  75.   for (i=1; i<10; i++)
  76.   {
  77.     pthread_mutex_lock(&mutex);
  78.     flag=flag+1;
  79.     if (flag==2)
  80.     {
  81.       flag=0;
  82.       pthread_cond_broadcast(&cond);
  83.     }
  84.     else pthread_cond_wait(&cond, &mutex);
  85.  
  86.     pthread_mutex_unlock(&mutex);
  87.  
  88.     ini[i]=times(&buf);
  89.     read(fd, &buffer[i%2][0], (sizeof(buffer)/2));
  90.     fin[i]=times(&buf);      
  91.  
  92.   printf("reader %d,  inizio %d,  fine %d,  tot %d\n", 
  93.           i, ini[i], fin[i], fin[i]-ini[i]);
  94.   }
  95. }
  96.  
  97. void eval_function(void)
  98. {
  99.   int  i, j, k, start, fine;
  100.   char max;
  101.  
  102.   for (i=0; i<9; i++)
  103.   {
  104.     pthread_mutex_lock(&mutex);
  105.     flag=flag+1;
  106.     if (flag==2) 
  107.     {
  108.       flag=0;
  109.       pthread_cond_broadcast(&cond);
  110.       pthread_mutex_unlock(&mutex);
  111.     }
  112.     else 
  113.     {
  114.        pthread_cond_wait(&cond, &mutex);
  115.        pthread_mutex_unlock(&mutex);
  116.     }
  117.  
  118.     calcini[i]=times(&buf);
  119.     max=0;
  120.     for (k=0; k<20; k++)
  121.       for (j=0; j<10000000; j++)
  122.         if (max<=buffer[i%2][j]) max=buffer[0][j];
  123.     calc[i]=times (&buf);
  124.  
  125.     printf("eval %d,  inizio %d,  fine %d,  tot %d\n", 
  126.             i, calcini[i], calc[i], calc[i]-calcini[i]);
  127.  
  128.   }
  129.  
  130.   calcini[9]=times(&buf);
  131.   max=0;
  132.   for (k=0; k<20; k++)
  133.     for (j=0; j<10000000; j++)
  134.       if (max<=buffer[1][j]) max=buffer[1][j];
  135.   calc[9]=times (&buf);
  136.   printf("eval 9,  inizio %d,  fine %d,  tot %d\n", 
  137.   calcini[9], calc[9], calc[9]-calcini[9]);
  138. }
  139.  
  140.