Página 1 de 1

Hilos o Threads (Intermedio-Avanzado)

Publicado: 23 Jul 2010, 20:11
por leos_79
Bueno voy a hablar de un tema avanzado en programacion, el tema de los hilos, hebras o threads.

Vamos a un poco de teoria, prometo que es resumida.

¿Que es un proceso?, un proceso a grandes rasgos es un programa en ejecucion, con todo su ambiente cargado,
con su seccion de pila datos y heap.
¿Que es un hilo?, es un camino de ejecucion, el mas simple de los procesos tiene al menos 1 hilo (el main).

Entonces los procesos pueden tener varios hilos, como minimo uno, y los hilos pueden ejecutarse en paralelo, Dando lugar a lo llamado Multithreading, o dicho de otra manera que nuestro programa haga varias cosas "al mismo tiempo".

Generalmente, los programadores basicos e intermedios, nunca han usado mas de un hilo (en programas estructurados, en objetos si, pero no se han enterado de ello).

varios hilos de un mismo proceso, comparten el area de datos, esto quiere decir que si pongo una variable global, todos los hilos lo van a poder ver.

Vamos a lo practico.

Código: Seleccionar todo

#include <windows.h>
#include <string.h>
#include <process.h>

int main()
{
int threadID;

_beginthreadex(NULL, 0,funciondehilo ,0,0,&threadID); /*Creo un hilo de 1mb de stack, y le paso como parametro el nombre de la funcion  */
.
./*el codigo de aqui se ejecutaria en paralelo con el codigo del hilo*/
.
WaitForSingleObject(threadID,INFINITE); /*espero a que el hilo termine */

}

unsigned __stdcall funciondehilo()
{

printf("soy un hilo y me voy a dormir 5 segundos");
sleep(5000);
}



 


Este es un programa muy simple de hilos con la Api de windows. Obviamente puedo levantar tantos hilos como guste.
Podria crear un hilo por cada cliente que se me conecte,para que lo atienda, o evitar heuristicas o tantas otras cosas, mas interesantes.
Algunas veces voy a necesitar que los hilos se sincronicen,en esos casos, hay varios elementos, como Mutex, memora compartida, Semaforos, para evitar que muchos hilos accedan a un recurso global al mismo tiempo, (como ser una entrada salida, la pantalla , el printf).

bueno una pequeña introduccion a los hilos, el que quiera ampliar que me pregunte o bien busque en google.

Saludos!

Re: Hilos o Threads (Intermedio-Avanzado)

Publicado: 23 Jul 2010, 20:20
por ps1c0s1s
Hola leo?? jaajj tantisimo tiempo , apareciste o sos nuevo en el foro?? ya casi ni recuerdo tu nick pero no dejo de decir que tus aportes me interesan ! jajaj !!!

Pd: Años pero años atras Antes en su tiempo un usuario vip inactivo por tanto tiempo no se lo veia mas con color !! , que tiempos aquellos !

Re: Hilos o Threads (Intermedio-Avanzado)

Publicado: 23 Jul 2010, 20:31
por leos_79
jajajaja muchas gracias ps1! , si estoy bastante inactivo, la facultad y demas yerbas me tienen a full. Ahora por suerte hice un parate, hace mucho queria poner algo sobre hilos aca, que es un tema que mucho no se toca y dado que este tiempo estuve programando hilos en linux solaris y windows, de tanto jugar queria aportar algo aca jajaja.

Pd: a veces me da verguenza aparecer con el color, muchas veces tambien lo eh dicho, que si de un dia para el otro quieren hacerme gris, no hay ningun problema

saludos!!

Re: Hilos o Threads (Intermedio-Avanzado)

Publicado: 23 Jul 2010, 21:02
por depuniet
El gris no te pega, y se que andas por la seccion c/c++ ¿Porque no le dejaste alli?

Re: Hilos o Threads (Intermedio-Avanzado)

Publicado: 23 Jul 2010, 21:07
por leos_79
Porque es un tema mas general de programacion o del sistema operativo y no tanto del lenguaje especifico.
Me basé en c, porq se me hace mas cómodo. Pero de hecho la api puede ser usada en varios lenguajes.

Re: Hilos o Threads (Intermedio-Avanzado)

Publicado: 24 Jul 2010, 00:07
por leos_79
ejemplo que compila , y funciona.

Código: Seleccionar todo

#include <stdio.h>
#include <windows.h>
#include <process.h>

unsigned __stdcall funciondehilo()
{

printf("soy un hilo desincronizado y me voy a dormir 5 segundos");
Sleep(5000);
}


main()
{
int threadID,id;

id = _beginthreadex(NULL, 0,funciondehilo ,0,0,&threadID);
printf("soy un hilo main\n");
printf("esto se imprime al mismo tiempo que lo otro, asi que si no sincronizo corro el riesgo de no se va a ver nada\n");
printf("esto se imprime al mismo tiempo que lo otro, asi que si no sincronizo corro el riesgo de no se va a ver nada\n");
printf("esto se imprime al mismo tiempo que lo otro, asi que si no sincronizo corro el riesgo de no se va a ver nada\n");
WaitForSingleObject(id,INFINITE); /*espero a que el hilo termine */
printf("se cerro el hijo\n");
}

Re: Hilos o Threads (Intermedio-Avanzado)

Publicado: 24 Jul 2010, 00:26
por CyRuX
sin duda brother time sin aparecer pero lo importante que estas pendiente.
siempre e seguido tus aportes cabron. son bien interesante gracias por compartirlo..

Re: Hilos o Threads (Intermedio-Avanzado)

Publicado: 24 Jul 2010, 19:51
por KainRazor
También se podría trabajar con los Threads desde las API's de Windows CreateThread, ResumeThread y demás no?

Aquí un ejemplo en VB que encontré en el API-Guide, pero, como dice el ejemplo, es muy inestable (Me parece que es más por el Sleep que por el CreateThread, a mí el API Sleep me da dolores de cabeza )

Código: Seleccionar todo

'Using the CreateThread function in Visual Basic
'is very risky! VB5 is 'kinda' stable, but VB6
'applications will probably crash when you
'use the CreateThread function.

'In a form
'Add a command button to the form
Private Sub Command1_Click()
    'KPD-Team 1999
    'URL: http://www.allapi.net/
    'E-Mail: [email protected]
    'After you click this button, try to move the window
    'You will see that the AsyncThread-function was executed asynchronously
    hThread = CreateThread(ByVal 0&, ByVal 0&, AddressOf AsyncThread, ByVal 0&, ByVal 0&, hThreadID)
    CloseHandle hThread
End Sub
Private Sub Form_Unload(Cancel As Integer)
    'If the thread is still running, close it
    If hThread <> 0 Then TerminateThread hThread, 0
End Sub
'In a module
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long
Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public hThread As Long, hThreadID As Long
Public Sub AsyncThread()
    'Let this thread sleep for 10 seconds
    Sleep 10000
    hThread = 0
End Sub
Gracias por el aporte

Re: Hilos o Threads (Intermedio-Avanzado)

Publicado: 24 Jul 2010, 20:55
por leos_79
BlackZeroX escribió:
KainRazor escribió:También se podría trabajar con los Threads desde las API's de Windows CreateThread, ResumeThread y demás no?
Es inestable por qué no hay Delegados, es decir no tienen acceso los hilos a propiedades ni componentes de un hilo madre o ajeno al mismo, por ende crashea, al igual qué estos no son soportados al 100%, esto es arreglado en la plataforma .Net

Dulces Lunas!¡.
En realidad , CreateThread, tiene problemas de memory leaks , en conjunto con CRT (c runtime libraries)

dado que las CRT (strtok, errno, strcpy etc etc) fueron creadas en tiempos de single threading, usaban variables globales.
Desde que aparecio el multithreading, un hilo podia estar pisando memoria de otro hilo, por ejemplo, dos errores al mismo tiempo,
devuelve distintos errno, y ahi habria un error de cual fue el ultimo error que ocurrio.
Y la solucion a eso no la dio .NET, sino que lo da la funcion beginthreadex, la cual adecua la memoria privada que utilizan las CRT, para evitar que se pisen entre ellas.
Por lo tanto, Siempre hay que evitar usar Createthread.

En teoria y practica:
un hilo hijo no puede acceder a la region privada de un hilo padre,pero si declaras una variable global para todo el proceso, ambos hilos pueden accederla.

Saludos!

Re: Hilos o Threads (Intermedio-Avanzado)

Publicado: 27 Jul 2010, 10:01
por p0is0n-123
Que grande sos leos...Siempre con cosas inetresantes
Gracias bro

Salu2