Bueno tienes problemas de concurrencia, porque usas un contador en lugar de enviar un parámetro con el indice que usara.
Supón que inicias todos los threads y se empieza a ejecutar al mismo tiempo. Obviamente cont va a tener 0 en varias de esas llamadas de hecho lo puedes visualizar mejor si imprimes cont.
Para evitar eso, creas un arreglo de parametros y lo llenas con los parametros que ocupas.
Código C:
Ver originalstruct hilos_random_parms
{
int randi;
int index;
};
struct hilos_random_parms thread1_args[5];
int i;
for(i = 0; i < 5; i++) {
thread1_args[i].randi = 10;
thread1_args[i].index = i;
}
Haces lo mismo al pasarlos
Código C:
Ver originalpthread_create(&thread1_id, NULL, &hilos_random, &thread1_args[0]);
pthread_create(&thread2_id, NULL, &hilos_random, &thread1_args[1]);
pthread_create(&thread3_id, NULL, &hilos_random, &thread1_args[2]);
pthread_create(&thread4_id, NULL, &hilos_random, &thread1_args[3]);
pthread_create(&thread5_id, NULL, &hilos_random, &thread1_args[4]);
Por ultimo sustituyes cont
Código C:
Ver originalint cont = p->index;
// Lo añades al SEED porque si no obtendras siempre los mismos numeros.
Al final te quedara algo así:
Código C:
Ver original#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
struct hilos_random_parms
{
int randi;
int index;
};
int aleatorios[5];
void* hilos_random(void* parameters)
{
struct hilos_random_parms* p = (struct hilos_random_parms*)parameters;
int cont = p->index;
aleatorios
[cont
] = (rand() % p
->randi
) + 1; printf("Número aleatorio: (%d) %d \n", cont
, aleatorios
[cont
]); cont++;
return NULL;
}
int main()
{
pthread_t thread1_id;
pthread_t thread2_id;
pthread_t thread3_id;
pthread_t thread4_id;
pthread_t thread5_id;
struct hilos_random_parms thread1_args[5];
int i;
for(i = 0; i < 5; i++) {
thread1_args[i].randi = 10;
thread1_args[i].index = i;
}
pthread_create(&thread1_id, NULL, &hilos_random, &thread1_args[0]);
pthread_create(&thread2_id, NULL, &hilos_random, &thread1_args[1]);
pthread_create(&thread3_id, NULL, &hilos_random, &thread1_args[2]);
pthread_create(&thread4_id, NULL, &hilos_random, &thread1_args[3]);
pthread_create(&thread5_id, NULL, &hilos_random, &thread1_args[4]);
pthread_join(thread1_id, NULL);
pthread_join(thread2_id, NULL);
pthread_join(thread3_id, NULL);
pthread_join(thread4_id, NULL);
pthread_join(thread5_id, NULL);
int total = 0;
for (i = 0; i < 5; i++)
{
total += aleatorios[i];
}
printf("Suma de los números: %d \n", total
);
return 0;
}
Pero es bastante sencillo:
Lecturas concurrentes si puedes.
Escrituras concurrentes solo uno a la vez.
Existen escenarios peores como deathlocks, donde te quedas esperando a que X thread termine pero ese X thread esta esperando a que tu termines.
También escenarios donde dices: Quiero que X se ejecute antes de Y.
Te recomiendo
The little book about semaphores