Te pongo un ejemplo completo de como crear 3 threads que multipliquen un array de numeros por 3, 4 y 5 de forma asincrona.
He modificado un poco las clases que puse antes.
Se puede hacer mejor, pero es para que veas como funciona:
CThread.h
Código C++:
Ver original#include <Windows.h>
class CThread
{
private:
HANDLE hThread;
unsigned int thread_id;
public:
CThread();
~CThread();
int Start(unsigned int (__stdcall * func)(void *), void * params, bool suspended);
void Resume();
void Suspend();
HANDLE GetHandle();
};
CThread.cpp
Código C++:
Ver original#include "CThread.h"
#include <process.h>
CThread::CThread()
{
this->hThread = NULL;
this->thread_id = 0;
}
CThread::~CThread()
{
CloseHandle(this->hThread);
this->thread_id = 0;
}
int CThread::Start(unsigned int (__stdcall * func)(void *), void * params, bool suspended)
{
if(this->hThread == NULL || this->thread_id == 0)
{
this->hThread = (void *) _beginthreadex(NULL, 0, func, params, 0, &this->thread_id);
if(suspended == false)
ResumeThread(this->hThread);
return 1;
}
return 0;
}
void CThread::Resume()
{
if(this->hThread)
{
ResumeThread(this->hThread);
}
}
void CThread::Suspend()
{
if(this->hThread)
{
SuspendThread(this->hThread);
}
}
HANDLE CThread::GetHandle()
{
return this->hThread;
}
main.cpp
Código C++:
Ver original#include <Windows.h>
#include <iostream>
#include <string>
#include "CThread.h"
using namespace std;
typedef struct{
string cadena;
int multiplicador;
}datos;
int valores[16];
unsigned int WINAPI multiplica(void * params);
CThread hilo[3];
int main(int argc, char *argv[])
{
//rellenamos el array valores para tener datos con los que trabajar:
for(int i=0;i<16;i++){ valores[i] = i; }
//creamos tres hilos de ejecucion:
hilo[0] = CThread(); datos *dato1 = new datos; dato1->cadena = "Hilo 1"; dato1->multiplicador = 3;
hilo[0] = CThread(); datos *dato2 = new datos; dato2->cadena = "Hilo 2"; dato2->multiplicador = 4;
hilo[0] = CThread(); datos *dato3 = new datos; dato3->cadena = "Hilo 3"; dato3->multiplicador = 5;
//ponemos a los tres hilos a trabajar
hilo[0].Start(multiplica, dato1, false);
hilo[1].Start(multiplica, dato2, false);
hilo[2].Start(multiplica, dato3, false);
WaitForSingleObject(hilo[0].GetHandle(), INFINITE);
WaitForSingleObject(hilo[1].GetHandle(), INFINITE);
WaitForSingleObject(hilo[2].GetHandle(), INFINITE);
cout << "Fin" << endl;
cin.get();
}
unsigned int WINAPI multiplica(void * params)
{
int cursor = 0;
datos * dato = (datos *)params; //obtenemos el parametro;
while(cursor < 16)
{
int resultado = valores[cursor]*dato->multiplicador;
cout << dato->cadena << ": " << resultado << endl;
cursor++;
Sleep(1);
}
cout << dato->cadena << ": TERMINADO" << endl;
return 1;
}
Al ejecutarlo devuelve algo como esto:
Código C++:
Ver originalHilo 1: Hilo 2: 0
Hilo 2: 4
0
Hilo 3: 0
Hilo 2: 8
Hilo 3: Hilo 2: 12
5
Hilo 1: Hilo 2: 16
Hilo 3: 10
3
Hilo 2: 20
Hilo 2: 24
Hilo 3: 15
Hilo 1: 6
Hilo 2: 28
Hilo 2: 32
Hilo 3: 20
Hilo 1: 9
Hilo 2: 36
Hilo 1Hilo 2: 40
: 12
Hilo 3Hilo 2: 44
: 25
Hilo 2: 48
Hilo 1: 15
Hilo 3: 30
Hilo 1: 18
Hilo 3: 35
Hilo 1: 21
Hilo 1: 24
Hilo 2: 52
Hilo 3: 40
Hilo 2: 56
Hilo 3: 45
Hilo 2: 60
Hilo 3: 50
Hilo 2: TERMINADO
Hilo 1: 27
Hilo 3: 55
Hilo 1: 30
Hilo 3: 60
Hilo 1: 33
Hilo 3: 65
Hilo 1: 36
Hilo 3: 70
Hilo 1: 39
Hilo 3: 75
Hilo 1: 42
Hilo 3: TERMINADO
Hilo 1: 45
Hilo 1: TERMINADO
Fin
Como ves al principio, las salidas por consola se mezclan un poco, esto es porque dentro del thread habrá que usar un mecanismo de mutex o semaforos, supongo.
Un saludo!!