Ver Mensaje Individual
  #8 (permalink)  
Antiguo 09/03/2015, 18:04
Avatar de razpeitia
razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: Uso de Threads en C

Cita:
Iniciado por jc_moj Ver Mensaje
¿Al usar srand antes de crear los thread no queda ya la semilla establecida y por tanto, cada thread, lo pida cuando lo pida, obtiene ya un número aleatorio adecuado?
Si, cada thread cuando lo pida ya te generara un numero random.

Excepto que como lo estas pidiendo números aletorios al mismo tiempo no es sorpresa que te regrese el mismo numero en diferentes threads.

Esto es por varias cosas:
1. srand tiene un estado interno
2. mandas a llamar srand al mismo tiempo y por lo tanto en el mismo estado interno
3. Obtienes el mismo numero aleatorio en varios threads

Este mismo ejemplo lo puedes con una simple suma.
Imagina que tienes una variable
Código:
i = 0
Y que al mismo tiempo sumas en 2 threads
Código:
i++
¿Cual crees que sea el resultado?
Bueno el resultado puede ser 1 o 2.

¿Porque pasa esto?
Por que como se ejecuta al mismo tiempo los 2 threads tienen el mismo estado (0).
Puede ser que en algunos casos, toda la suma del primer thread antes del segundo. Lo cual parecerá que funciona bien.

Ejemplo sencillo

Código C:
Ver original
  1. #include <pthread.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4.  
  5. #define N 5
  6.  
  7. int count = 0;
  8.  
  9. void* work(void* parameters)
  10. {
  11.     printf("Count: %d \n", count);
  12.     count += 1;
  13.     return NULL;
  14. }
  15.  
  16. int main()
  17. {
  18.     pthread_t thread[N];
  19.     int i;
  20.     for(i = 0; i < N; i++)
  21.         pthread_create(&thread[i], NULL, work, NULL);
  22.     for(i = 0; i < N; i++)
  23.         pthread_join(thread[i], NULL);
  24.  
  25.     return 0;
  26. }