#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
pthread_mutex_t lock;//CREO EL MUTEX GLOBAL
// Esta es la funcion que ejecutan los threads
void* funcion_thr(void* pParametro){
pthread_mutex_lock(&lock);// HAGO LOCK
thr_param_t parametro = *((thr_param_t*)pParametro);
printf("%s %d\n", parametro.cadena, parametro.id);
pthread_mutex_unlock(&lock);// HAGO UNLOCK
// Una vez terminamos, devolvemos el valor.
pthread_exit(&(parametro.id));
}
int main(){
pthread_mutex_init(&lock, NULL);//INICIALIZO EL MUTEX
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 *)¶m[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;
}