#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_THREADS 10
// tipo de datos y tabla con los parametros
typedef struct {
int id;
char * cadena;
} thr_param_t;
thr_param_t param[ MAX_THREADS] ;
// tenemos que crear un array para los parámetros porque los pasamos por
// referencia. Así, si solo tuviéramos una variable para los parámetros
// al modificar esta modificaríamos todas las que habíamos pasado anteriormente
// porque los threads no se quedan con el valor sino con la dirección
// Esta es la funcion que ejecutan los threads
void * funcion_thr( void * pParametro) {
thr_param_t parametro = * ( ( thr_param_t* ) pParametro) ;
printf ( "%s %d\n " , parametro.cadena , parametro.id ) ;
// Una vez terminamos, devolvemos el valor.
pthread_exit( & ( parametro.id ) ) ;
}
int main( ) {
int i, * resultadoLocalMain;
// tabla con los identificadores de los threads
pthread_t vectorDeHilos[ MAX_THREADS] ;
// creamos los threads
printf ( "Creando threads...\n " ) ;
for ( i= 0 ; i< MAX_THREADS; i++ ) {
param[ i] .cadena = strdup( "Hola, soy el thread numero: " ) ;
param[ i] .id = i;
pthread_create( & vectorDeHilos[ i] , NULL , funcion_thr,( void * ) & param[ i] ) ;
}
// esperamos que terminen los threads
printf ( "Threads creados. Esperando que terminen...\n " ) ;
for ( i= 0 ; i< MAX_THREADS; i++ ) {
pthread_join( vectorDeHilos[ i] , ( void ** ) & resultadoLocalMain) ;
printf ( "El thread %d devolvio el valor %d\n " , i, * resultadoLocalMain) ;
}
// sacamos el mensajito y salimos del programa
printf ( "Todos los threads finalizados. Adios!\n " ) ;
return 0 ;
}
I2luY2x1ZGUgPHB0aHJlYWQuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2RlZmluZSBNQVhfVEhSRUFEUyAxMAoKLy8gdGlwbyBkZSBkYXRvcyB5IHRhYmxhIGNvbiBsb3MgcGFyYW1ldHJvcwp0eXBlZGVmIHN0cnVjdCB7CglpbnQgaWQ7CgljaGFyICpjYWRlbmE7Cn0gdGhyX3BhcmFtX3Q7Cgp0aHJfcGFyYW1fdCBwYXJhbVtNQVhfVEhSRUFEU107Ci8vIHRlbmVtb3MgcXVlIGNyZWFyIHVuIGFycmF5IHBhcmEgbG9zIHBhcsOhbWV0cm9zIHBvcnF1ZSBsb3MgcGFzYW1vcyBwb3IKLy8gcmVmZXJlbmNpYS4gQXPDrSwgc2kgc29sbyB0dXZpw6lyYW1vcyB1bmEgdmFyaWFibGUgcGFyYSBsb3MgcGFyw6FtZXRyb3MKLy8gYWwgbW9kaWZpY2FyIGVzdGEgbW9kaWZpY2Fyw61hbW9zIHRvZGFzIGxhcyBxdWUgaGFiw61hbW9zIHBhc2FkbyBhbnRlcmlvcm1lbnRlCi8vIHBvcnF1ZSBsb3MgdGhyZWFkcyBubyBzZSBxdWVkYW4gY29uIGVsIHZhbG9yIHNpbm8gY29uIGxhIGRpcmVjY2nDs24KCi8vIEVzdGEgZXMgbGEgZnVuY2lvbiBxdWUgZWplY3V0YW4gbG9zIHRocmVhZHMKdm9pZCogZnVuY2lvbl90aHIodm9pZCogcFBhcmFtZXRybyl7CgoJdGhyX3BhcmFtX3QgcGFyYW1ldHJvID0gKigodGhyX3BhcmFtX3QqKXBQYXJhbWV0cm8pOwoJcHJpbnRmKCIlcyAlZFxuIiwgcGFyYW1ldHJvLmNhZGVuYSwgcGFyYW1ldHJvLmlkKTsKCgkvLyBVbmEgdmV6IHRlcm1pbmFtb3MsIGRldm9sdmVtb3MgZWwgdmFsb3IuCglwdGhyZWFkX2V4aXQoJihwYXJhbWV0cm8uaWQpKTsKfQoKaW50IG1haW4oKXsKCglpbnQgaSwgKnJlc3VsdGFkb0xvY2FsTWFpbjsKCS8vIHRhYmxhIGNvbiBsb3MgaWRlbnRpZmljYWRvcmVzIGRlIGxvcyB0aHJlYWRzCglwdGhyZWFkX3QgdmVjdG9yRGVIaWxvc1tNQVhfVEhSRUFEU107CgkvLyBjcmVhbW9zIGxvcyB0aHJlYWRzCglwcmludGYoIkNyZWFuZG8gdGhyZWFkcy4uLlxuIik7Cglmb3IgKGk9MDsgaTxNQVhfVEhSRUFEUzsgaSsrKSB7CgkJcGFyYW1baV0uY2FkZW5hID0gc3RyZHVwKCJIb2xhLCBzb3kgZWwgdGhyZWFkIG51bWVybzogIik7CgkJcGFyYW1baV0uaWQgPSBpOwoJCXB0aHJlYWRfY3JlYXRlKCZ2ZWN0b3JEZUhpbG9zW2ldLCBOVUxMLCBmdW5jaW9uX3RociwoIHZvaWQgKikmcGFyYW1baV0pOwoJfQoJLy8gZXNwZXJhbW9zIHF1ZSB0ZXJtaW5lbiBsb3MgdGhyZWFkcwoJcHJpbnRmKCJUaHJlYWRzIGNyZWFkb3MuIEVzcGVyYW5kbyBxdWUgdGVybWluZW4uLi5cbiIpOwoJZm9yIChpPTA7IGk8TUFYX1RIUkVBRFM7IGkrKykgewoJCXB0aHJlYWRfam9pbih2ZWN0b3JEZUhpbG9zW2ldLCAodm9pZCoqKSZyZXN1bHRhZG9Mb2NhbE1haW4pOwoJCXByaW50ZigiRWwgdGhyZWFkICVkIGRldm9sdmlvIGVsIHZhbG9yICVkXG4iLCBpLCAqcmVzdWx0YWRvTG9jYWxNYWluKTsKCX0KCS8vIHNhY2Ftb3MgZWwgbWVuc2FqaXRvIHkgc2FsaW1vcyBkZWwgcHJvZ3JhbWEKCXByaW50ZigiVG9kb3MgbG9zIHRocmVhZHMgZmluYWxpemFkb3MuIEFkaW9zIVxuIik7CglyZXR1cm4gMDsKfQ==