Untitled
unknown
plain_text
4 years ago
3.0 kB
10
Indexable
Following is the code in sum3files.c :
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
/*
* Mutex for printing.
*/
pthread_mutex_t printf_mutex = PTHREAD_MUTEX_INITIALIZER;
struct Info
{
int id;
char *filename;
};
void* func(void *arg)
{
struct Info *info = (struct Info*) arg;
/*
* Sum of file.
*/
float sum = 0;
int numbers_read = 0;
/*
* We open the file.
*/
FILE *f = fopen(info->filename, "r");
if(f == NULL)
{
printf("Cannot open %s\n", info->filename);
exit(1);
}
/*
* We keep reading the file.
*/
while(1)
{
float number;
if(fscanf(f, " %f", &number) == EOF)
{
/*
* We are done.
*/
break;
}
numbers_read++;
sum = sum + number;
pthread_mutex_lock(&printf_mutex);
printf("Thread%d reads %d. The value is %.6f. The sum is : %.6f\n",
info->id, numbers_read, number, sum);
pthread_mutex_unlock(&printf_mutex);
}
/*
* We close the file.
*/
fclose(f);
/*
* We print the final result.
*/
pthread_mutex_lock(&printf_mutex);
printf("Thread%d Sum is : %.6f\n", info->id, sum);
pthread_mutex_unlock(&printf_mutex);
return NULL;
}
int main()
{
/*
* Info for the 3 threads.
*/
struct Info infos[3] = {
{1, "input1.txt"},
{2, "input2.txt"},
{3, "input3.txt"},
};
/*
* We spawn the 3 threads, and wait for them to finish.
*/
int i = 0;
pthread_t tids[3];
for(i = 0; i < 3; i++)
{
while(pthread_create(&tids[i], NULL, func, &infos[i]));
}
for(i = 0; i < 3; i++)
{
pthread_join(tids[i], NULL);
}
return 0;
}
Following is the run for the given input files :
gcc sum3files.c -o sum3files -lpthread
./sum3files
Thread1 reads 1. The value is 1.230000. The sum is : 1.230000
Thread1 reads 2. The value is 2.660000. The sum is : 3.890000
Thread1 reads 3. The value is 3.780000. The sum is : 7.670000
Thread1 reads 4. The value is 8.560000. The sum is : 16.230000
Thread1 reads 5. The value is 9.820000. The sum is : 26.049999
Thread2 reads 1. The value is 5.230000. The sum is : 5.230000
Thread2 reads 2. The value is 5.660000. The sum is : 10.889999
Thread2 reads 3. The value is 6.890000. The sum is : 17.779999
Thread2 reads 4. The value is 6.740000. The sum is : 24.519999
Thread2 reads 5. The value is 8.960000. The sum is : 33.480000
Thread1 Sum is : 26.049999
Thread3 reads 1. The value is 5.230000. The sum is : 5.230000
Thread3 reads 2. The value is 5.660000. The sum is : 10.889999
Thread3 reads 3. The value is 8.890000. The sum is : 19.779999
Thread3 reads 4. The value is 9.740000. The sum is : 29.519999
Thread3 reads 5. The value is 7.960000. The sum is : 37.480000
Thread2 Sum is : 33.480000
Thread3 Sum is : 37.480000
Editor is loading...