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
/
thread2.c
< prev
next >
Wrap
C/C++ Source or Header
|
2005-03-20
|
4KB
|
163 lines
#include <pthread.h>
#include <sys/types.h>
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/times.h>
/********************************************************
* file thread2.c *
* legge 10 volte dei blocchi da 10 MB dal file *
* mega.dat (deve gia'esistere) usando un buffer di *
* memoria da 2MB e 2 thread che leggono e calcolano *
* in interleaving *
* Scrive i tempi *
* *
* Provare anche ad usare un buffer con 2 indici *
* buffer[2][10000000] invece di buffer[20000000] *
* e verificare i tempi *
* *
* gcc -D_REENTRANT thread2.c -o thread2.exe -lpthread *
*********************************************************/
int fd, valC, valD;
char buffer[20000000];
int ini[10], fin[10], calc[10], calcini[10];
clock_t t1, t2;
struct tms buf;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int flag=0;
pthread_t reader;
pthread_t eval;
void reader_function(void);
void eval_function(void);
main ()
{
int i;
t1=times(&buf);
printf("valore times %d\n", t1);
fd=open("mega.dat", O_RDONLY);
ini[0]=times(&buf);
read(fd, &buffer[0], (sizeof(buffer)/2));
fin[0]=times(&buf);
// printf("reader 0, inizio %d, fine %d, tot %d\n", ini[0], fin[0],
// fin[0]-ini[0]);
pthread_create(&reader, NULL, (void*)&reader_function, NULL);
pthread_create(&eval, NULL, (void*)&eval_function, NULL);
pthread_join(reader, NULL);
pthread_join(eval, NULL);
t2=times(&buf);
printf("fine times %d\n", t2);
printf("times totale %d\n", t2-t1);
valD=0;
for (i=0; i<10; i++)
valD=valD+fin[i]-ini[i];
valC=0;
for (i=0; i<10; i++)
valC=valC+calc[i]-calcini[i];
printf("tempo lettura disco %d, tempo calcolo %d\n", valD, valC);
}
void reader_function(void)
{
int i, start;
for (i=1; i<10; i++)
{
pthread_mutex_lock(&mutex);
flag=flag+1;
if (flag==2)
{
flag=0;
pthread_cond_broadcast(&cond);
}
else pthread_cond_wait(&cond, &mutex);
pthread_mutex_unlock(&mutex);
if ((i%2)==1)
{
ini[i]=times(&buf);
read(fd, &buffer[10000000], (sizeof(buffer)/2));
fin[i]=times(&buf);
}
else
{
ini[i]=times(&buf);
read(fd, &buffer[0], (sizeof(buffer)/2));
fin[i]=times(&buf);
}
// printf("reader %d, inizio %d, fine %d, tot %d\n", i,
// ini[i], fin[i], fin[i]-ini[i]);
}
}
void eval_function(void)
{
int i, j, k, start, fine;
char max;
for (i=0; i<9; i++)
{
pthread_mutex_lock(&mutex);
flag=flag+1;
if (flag==2)
{
flag=0;
pthread_cond_broadcast(&cond);
pthread_mutex_unlock(&mutex);
}
else
{
pthread_cond_wait(&cond, &mutex);
pthread_mutex_unlock(&mutex);
}
if ((i%2)==0)
{
calcini[i]=times(&buf);
max=0;
for (k=0; k<20; k++)
for (j=0; j<10000000; j++)
if (max<=buffer[j]) max=buffer[j];
calc[i]=times (&buf);
}
else
{
calcini[i]=times(&buf);
max=0;
for (k=0; k<20; k++)
for (j=10000000; j<20000000; j++)
if (max<=buffer[j]) max=buffer[j];
calc[i]=times (&buf);
}
// printf("eval %d, inizio %d, fine %d, tot %d\n", i, calcini[i],
// calc[i], calc[i]-calcini[i]);
}
calcini[9]=times(&buf);
max=0;
for (k=0; k<20; k++)
for (j=10000000; j<20000000; j++)
if (max<=buffer[j]) max=buffer[j];
calc[9]=times (&buf);
// printf("eval 9, inizio %d, fine %d, tot %d\n", calcini[9], calc[9],
// calc[9]-calcini[9]);
}