Ver Mensaje Individual
  #7 (permalink)  
Antiguo 21/03/2015, 16:16
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: El gran misterio de unos threads

Un std::future se usa como una forma de esperar la ocurrencia de un evento, es el objeto devuelto por std::async.
async invoca a la función que recibe por parámetro (en este caso le estoy pasando una expresión lambda, pero puede ser un puntero a función, como fun de tu ejemplo, o una función objeto, o una closure), que va a ejecutarse en un nuevo thread (gracias al parámetro launch::async). Un sitio de referencia obligado para mí es
http://en.cppreference.com/w/cpp/thread/async

El mecanismo es similar al de std::thread y join, aunque future permite obtener el resultado devuelto por la función thread con get(), que en este caso no importa porque es void, pero que es bloqueante, por si el thread aún no ha terminado la ejecución.

Te comentaba que ese lock() en fun, hace que el sistema de threads termine siendo secuencial; no sé cómo estará en el sitema real, pero, si guarda esta analogía, convendría revisarlo.


---------- Edito: ¡Ah ha! -----------------
Dice el estándar C++11...
Cita:
26.5.6 Class random_device
1. A random_device uniform random number generator produces non-deterministic random numbers.

2. If implementation limitations prevent generating non-deterministic random numbers, the implementation
may employ a random number engine.
Y algo más abajo...
Cita:
double entropy() const noexcept;
5. Returns: If the implementation employs a random number engine, returns 0.0. Otherwise, returns an entropy estimate for the random numbers returned by operator(), in the range min() to log2 (max() + 1).
Entonces, con el compilador que estoy usando (gcc) yo siempre obtengo la misma lista de valores y la misma suma; y es porque el gcc emplea un random number engine.
El resultado de
Código:
std::cout << "randrom_device entropy = " << rd.entropy() << '\n';
me muestra un 0, redondamente.

Y ¿en el tuyo?
Prueba con esa misma línea y cuéntame si te muestra 0 (que espero que no) o algún otro valor (el de la entropía, me cache).



---------- Edito: de acá para abajo, no va más ---------
Con respecto al problema de los resultados distintos, la verdad es que no me doy cuenta. Yo entiendo que si pones a correr 8 threads vas a obtener 8 valores x al azar, y la suma de ellos; y si corres 500 threads obtendrás 500 valores y una suma mayor. Es posible que no te haya entendido y que nos estemos refiriendo a cosas diferentes.

Cuando ejecuto tu programa con 7 threads, obtengo:
0.726249
0.915339
0.594324
0.515358
0.975149
0.661561
0.528652
suma: 4.91663

Y si lo ejecuto con 8 threads:
0.726249
0.915339
0.594324
0.515358
0.975149
0.661561
0.528652
0.788493
suma: 5.70513

donde los primeros 7 valores son los mismos para las dos listas, como era de esperar.
(Edito: como era de esperar en el compilador que estoy usando, pero evidentemente no en el tuyo)

Última edición por lareto; 21/03/2015 a las 19:38 Razón: ¡Ah ha! Acá está (casi seguro)