joi, 20 mai 2010

Linux Thread app


/*Se presupune că într-un fişier text numbers.in, pe fiecare linie se găsesc
două numere întregi. Să se scrie programul C, care citeşte, pe rând, toate
liniile din fişier şi pentru fiecare linie citită creează un nou thread, căruia îi
transmite ca parametri (în cadrul unei structuri) cele două numere aflate pe
linia respectivă. Fiecare thread va prelua cei doi parametri, va face media
lor aritmetică, va scrie în fişierul result_threads.out, pe o linie, cele trei
numere şi identificatorul propriu de thread şi, în plus, numărul ce reprezintă
media aritmetică îl va transmite ca parametru funcţiei pthread_exit. După
terminarea citirii fişierului numbers.in, thread-ul main va prelua toate
rezultatele transmise de thread-urile create şi le va scrie în fişierul
results_main.out, fiecare rezultat alături de identificatorul thread-ului care
l-a produs. Să se compare, apoi conţinutul celor două fişiere.
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#include <pthread.h>


void *print_message_function( void *ptr );
typedef struct inregistrare{
int a;
int b;
}INREGISTRARE;

INREGISTRARE *aux;
//*aux=(INREGISTRARE *)malloc(sizeof(INREGISTRARE));
FILE * pOut;

int *resultat;

main()
{
FILE * pFile,*file2;
int n = 0,a,b,iret;
pthread_t thread;
pFile = fopen ("numbers.in","r");
pOut = fopen ("result_threads.out","w");
file2 = fopen ("result_main.out","w");

if (pFile==NULL) perror ("Error opening file");
else
{
while (!feof(pFile)) {
fscanf (pFile,"%d",&a);
fscanf (pFile,"%d",&b);
//printf("Perechea[%d]: %d - %d\n",n,a,b);
n++;
aux=(INREGISTRARE *)malloc(sizeof(INREGISTRARE));
aux->a=a;
aux->b=b;
//printf("Perechea: %d - %d\n",aux->a,aux->b);
iret = pthread_create( &thread, NULL, print_message_function, (void*) aux);
pthread_join(thread,&aux);
printf("\nRez intors de fct: %d %d\n",aux->a,aux->b);
fprintf(file2,"media: %-3d ID: %d\n",aux->a,aux->b);
}
}


exit(0);
}

void *print_message_function( void *ptr )
{
int media;
INREGISTRARE *message;
message = (INREGISTRARE *) ptr;
printf("Perechea: %d - %d\n",message->a,message->b);
media=(message->a+message->b)/2;
fprintf(pOut,"a: %-3d b:%-3d media:%-3d ID:%d\n",message->a,message->b,media,pthread_self());
aux->a=media;javascript:void(0)
aux->b=pthread_self();
pthread_exit((void *)aux);
}