| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
krattoz
Registrado: 30 Jun 2012 Mensajes: 1
| Publicado: 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",a 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.
| | | Volver arriba | |  | untio

Registrado: 17 Sep 2008 Mensajes: 380 Ubicación: MICA S.A.
| Publicado: 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
| Publicado: 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 | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |