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

Hola; acomodé un poco el código caprichosamente más a mi gusto.

También quité el lock sobre cout que obligaba a una secuencia sincrónica, que si está sólo como una forma de debugear no está de más, pero no hay que olvidarse de sacarlo. En su lugar guardo los x en un vector que se muestra cuando todos los threads terminaron su trabajo.

Ah, agregué una seed al generator para obtener valores suma diferentes, que puede comentarse si no hace falta.

Creo que así está algo más eficiente, aunque me parece que en una discusión anterior había quedado la conclusión de que C++ y eficiencia no van de la mano. De todos modos yo insisto porque me divierte. Si te apetece, podrías comparar ambas versiones y contarnos si se ha ganado algo o no.

Código C++:
Ver original
  1. #include <iostream>
  2. #include <vector>
  3. #include <random>
  4. #include <future>
  5.  
  6.  
  7. using namespace std;
  8.  
  9. int main()
  10. {
  11.     random_device rd;
  12.     mt19937 generator(rd());
  13.     generator.seed(time(nullptr));
  14.     uniform_real_distribution<> distUni(0.0, 1.0);
  15.  
  16.     const unsigned int N_THREADS = 7;
  17.     vector<double> out(N_THREADS);
  18.  
  19.     double suma = 0.0;
  20.  
  21.     vector<future<void>> f;
  22.  
  23.     for (auto i = 0u; i < N_THREADS; i++) {
  24.         f.push_back( async(launch::async,
  25.         [&generator, &distUni, &out, i]
  26.         {
  27.             double x = distUni(generator);
  28.             out[i] = x;
  29.         } ) );
  30.     }
  31.  
  32.     for(auto& i : f) {
  33.         i.get();
  34.     }
  35.  
  36.     for(auto& i : out) {
  37.         cout << i << '\n';
  38.         suma += i;
  39.     }
  40.     cout << "\nsuma: " << suma << endl;
  41.  
  42.     return 0;
  43. }

Última edición por lareto; 21/03/2015 a las 04:07