/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Fibonacci Con Thread (win32)

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
krattoz



Registrado: 30 Jun 2012
Mensajes: 1

MensajePublicado: 30/06/2012 4:49 pm
Título: Fibonacci Con Thread (win32)

Hola quisiera que me orienten en el tema de hilos ya que tegno q realizar el fibonacci con hilos la idea es que de un hilo llame a varios para que estos calculen su fibonacci

les dejo mi codigo aver si me pueden guiar porfa:


#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
DWORD Sum;
int resultado,resultado1,resultado2;
DWORD aux;

DWORD WINAPI summation(void* Param){
DWORD Upper = *(DWORD*)Param;
DWORD i=0;
for(i; i<=Upper; i++)
Sum +=i;
return 0;
}

DWORD WINAPI multiplicacion(LPVOID Param)
{
aux =*(int*)Param;
if(aux ==0 || aux==1){
return aux;}
// else{
// return(multiplicacion(Param-1)+multiplicacion(Param-2));
//}
else{

int aux1=*(int*)Param-1;
int aux2=*(int*)Param-2;
DWORD Idhilo1,Idhilo2;
HANDLE hilo1,hilo2;
hilo1=CreateThread(NULL,0,multiplicacion,&aux1,0,&Idhilo1);
if (hilo1!=NULL){
WaitForSingleObject(hilo1,0);
resultado1=aux;
//printf("\n %d",aux);
CloseHandle(hilo1);
}

hilo2=CreateThread(NULL,0,multiplicacion,&aux2,0,&Idhilo2);
if(hilo2!=NULL){
WaitForSingleObject(hilo2,0);
resultado2=aux;
CloseHandle(hilo2);
}
resultado=aux1+aux2;
aux=resultado;
//printf("%d",resultado);
return aux;
}
}

int main(int argc, char *argv[]){

DWORD ThreadId;
HANDLE ThreadHandle;
int Param;
int a;
//a=multiplicacion();
//printf("%d",aWink
if (argc!=2){
fprintf(stderr, "Es necesario un integer\n");
return -1;
}
Param = atoi(argv[1]);
if (Param<0){
fprintf(stderr, "es necesario un integer >=0\n");
return -1;
}

//se crea el hilo
ThreadHandle=CreateThread(NULL,0,multiplicacion,&Param,0,&ThreadId);
if (ThreadHandle!=NULL){
WaitForSingleObject(ThreadHandle,INFINITE);
CloseHandle(ThreadHandle);
//ExitThread(5);
//printf("Suma = %d\n",GetExitCodeThread(ThreadHandle,&Sum));
printf("Fibonacci de %d = %d",Param,aux);
}


}


me base en este codigo para implenter hilos
(se ejecuta por consola)
de antemano Gracias
Volver arriba
untio



Registrado: 17 Sep 2008
Mensajes: 380
Ubicación: MICA S.A.

MensajePublicado: 02/07/2012 12:27 pm
Título:

Hola,

Así a bote pronto se ven algunas cosillas en tu código.

En una parte llamas a WaitForSingleObject sin tener en cuenta su retorno.

Lee:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms687032%28v=vs.85%29.aspx

Hay un modo de que un thread devuelva un valor directamente (aunque con un puntero también se puede hacer) a través de:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms683190%28v=vs.85%29.aspx

Espero que te sea útil.
_________________
Hago algo muy raro: primero leo las instrucciones.
Volver arriba
untio



Registrado: 17 Sep 2008
Mensajes: 380
Ubicación: MICA S.A.

MensajePublicado: 03/07/2012 7:12 am
Título:

Hola, mundo:

He hecho las modificaciones necesarias para que el programa no genere una violación de segmento.

-El thread creaba otro thread que creaba otro, que creaba otro...y, al parecer, nunca se daba la condicion de fin.

-Nadie esperaba a que acabaran los threads hijos del segundo thread.

Naturalmente, el programa todavía no calcula los números de fibonacci. Ese tema no me incumbe.

El código, retocado lo mínimo a mi gusto es:

Código:

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
DWORD Sum;
int resultado,resultado1,resultado2;
INT aux;


DWORD WINAPI summation(void* Param)
{
    DWORD Upper = *(DWORD*)Param;
    DWORD i=0;
    for(i; i<=Upper; i++)
        Sum +=i;
    return 0;
}

DWORD WINAPI multiplicacion(LPVOID Param)
{
  //  int auxyo=(*((int*)Param));
    aux = (*(int *) Param);
    if(aux ==0 || aux==1)
    {
        return aux;
    }
// else{
// return(multiplicacion(Param-1)+multiplicacion(Param-2));
//}
    else
    {
        int aux1=(*((int*)Param))-1;
        int aux2=(*((int*)Param))-2;
//        DWORD Idhilo1,Idhilo2;
        HANDLE hilo1,hilo2;
        hilo1=CreateThread(NULL,0,multiplicacion,&aux1,0,NULL);
        if (hilo1!=NULL)
        {
            WaitForSingleObject(hilo1,INFINITE);
            resultado1=aux;
            //printf("\n %d",aux);
            CloseHandle(hilo1);
        }

        hilo2=CreateThread(NULL,0,multiplicacion,&aux2,0,NULL);
        if(hilo2!=NULL)
        {
            WaitForSingleObject(hilo2,INFINITE);
            resultado2=aux;
            CloseHandle(hilo2);
        }
        resultado=aux1+aux2;
        aux=resultado;
//printf("%d",resultado);
        return aux;
    }
}

int main(int argc, char *argv[])
{
    int Param;
  //  DWORD ThreadId;
    HANDLE ThreadHandle;

    int a;
//a=multiplicacion();
//printf("%d",aWink
    if (argc!=2)
    {
        fprintf(stderr, "Es necesario un integer\n");
        return -1;
    }
    Param = atoi(argv[1]);
    if (Param<0)
    {
        fprintf(stderr, "es necesario un integer >=0\n");
        return -1;
    }

//se crea el hilo
    ThreadHandle=CreateThread(NULL,0,multiplicacion,(void *) &Param,0,NULL);
    if (ThreadHandle!=NULL)
    {
        WaitForSingleObject(ThreadHandle,INFINITE);
        CloseHandle(ThreadHandle);
//ExitThread(5);
//printf("Suma = %d\n",GetExitCodeThread(ThreadHandle,&Sum));
        printf("Fibonacci de %d = %d",Param,aux);
    }

}


Espero que tenga alguna utilidad.
_________________
Hago algo muy raro: primero leo las instrucciones.
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7527
Ubicación: Mexico

MensajePublicado: 05/07/2012 8:56 am
Título:

Una forma ligeramente distinta para calcular la serie:
Código:
#include <stdio.h>
#include <stdlib.h>

#include <windows.h>

DWORD WINAPI fn(LPVOID lpv);

int main(void)
{
   int i;
   int r;
   
   for (i = 0; i < 10; i++){
      r = i;
      fn(&r);
     
      printf("%d:%3d\n", i, r);
   }
   
   return EXIT_SUCCESS;
}

DWORD WINAPI fn(LPVOID lpv)
{
   int *p = lpv;
   
   if (*p > 1){
      HANDLE th;
      int r[2];
      int i;
     
      for (i = 0; i < 2; i++){
         r[i] = *p - 1 - i;
         
         th = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) fn, r + i, 0, NULL);
         WaitForSingleObject(th, INFINITE);
         CloseHandle(th);
      }
     
      *p = r[0] + r[1];
   }
   
   return 0;
}


Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com