martes, 6 de septiembre de 2011

Curso de programación: Capítulo 11. Threads Nativos de Windows


Hola a todos,

El capitulo de hoy tratará sobre como crear threads y poder aprovechar nuestros procesadores de N cores.

Hay varias formas de usar threads, pero la más usual es atacar a la API de windows y "pedirle" que nos cree los threads. Como se hace ?? Sencillo, creo que nada mejor que un ejemplo para verlo claro.

DWORD Cont=0; // Variable compartida

DWORD  WINAPI incrementar(LPVOID param)
{
  DWORD n = *(DWORD*)param;
  int i;

  for( int i = 0 ; i < n  ; i++)
  {
    Cont++;
    cout << "Contador sumando = " << Cont << "\n";
  }
  return 0;
}

DWORD  WINAPI decrementar(LPVOID param)
{
  DWORD n = *(DWORD*)param;

  for( int i = 0 ; i < n  ; i++)
  {
    Cont--;
    cout << "Contador restando = " << Cont << "\n";
  }
  return 0;
}

int main(int argc, char *argv[]) {
    DWORD TIdi,TIdd;
    HANDLE THandlei,THandled;
    int param = 100;

    //Creamos dos threads
    THandlei = CreateThread(NULL,0,incrementar,&param,0,&TIdi);
    THandled = CreateThread(NULL,0,decrementar,&param,0,&TIdd);

    cout << "Contador = " << Cont << "\n";

    //Esperamos a que acaben todos los threads
    WaitForSingleObject(THandlei,INFINITE);
    WaitForSingleObject(THandled,INFINITE);

    //Eliminamos los threads
    CloseHandle(THandlei);
    CloseHandle(THandled);

    cout << "Contador = " << Cont << "\n";

    system("PAUSE");
}

Tendreis que tener el archivo windows.h incluido para que os funcione.
Vereis que si lo ejecutais la traza que os dará será bastante curiosa.
Si quisieramos crear más threads solo tendriamos que usar más CreateThread,WaitForSingleObject y CloseHandle.

En el math engine, os enseñaré como implementarlo con un número arbitario de threads mediante vectores de handlers de threads y observareis que la mejora de rendimiento es escalofriante.

Espero que os haya gustado y hayais aprendido.

Nos vemos
LordPakusBlog

0 comentarios :

Publicar un comentario

Entradas populares