Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] (C++11) Duda sobre los threads

Estas en el tema de (C++11) Duda sobre los threads en el foro de C/C++ en Foros del Web. Llevo un buen rato viendo la referencia pero no consigo ver lo que quiero: http://en.cppreference.com/w/cpp/thread Quiero resolver un sudoku por fuerza bruta, asi que tengo ...
  #1 (permalink)  
Antiguo 29/06/2013, 11:01
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 12 años, 5 meses
Puntos: 28
(C++11) Duda sobre los threads

Llevo un buen rato viendo la referencia pero no consigo ver lo que quiero:
http://en.cppreference.com/w/cpp/thread

Quiero resolver un sudoku por fuerza bruta, asi que tengo un array que simboliza el tablero:
Cita:
short Tablero[MAX][MAX];
El algoritmo lo tengo pero quería hacerlo multihilo la idea es hacer 9 tableros y pasarlo a 9 hilos (cada uno con una casilla prerellenada con distinto valor). Después esperar y cuando un hilo acabe coger el valor y pasarlo por pantalla (y por supuesto, suspender el resto de hilos).

Creo que me va a estallar la cabeza. ¿Que objeto tengo que usar? Creo que un future no me vale porque retorna el valor (y Tablero lo paso por referencia), promise también hace lo mismo creo.
  #2 (permalink)  
Antiguo 29/06/2013, 12:08
Avatar de L3m0n  
Fecha de Ingreso: diciembre-2011
Mensajes: 219
Antigüedad: 13 años
Puntos: 46
Respuesta: (C++11) Duda sobre los threads

Yo lo implementaria sin los hilos y ver que rendimiento tiene, ya que aunque no se que algoritmo es no creo que sea algo que necesite de 9 hilos, sería bastante extraño.
  #3 (permalink)  
Antiguo 29/06/2013, 12:20
Avatar de 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: (C++11) Duda sobre los threads

Yo no te recomendaría hacerlo por threads aun.

¿Por que?

Bueno, porque sudoku tiene, varias reglas. Una de ellas, es que cada tablero de 3x3 no debe de tener números repetidos todos del 1 al 9. Pero esta también aplica para cada una de las filas y las columnas de todo el tablero 9x9.

Una vez que hagas la solución sin threads vas a poder comprender que partes las puedes hacer en paralelo y que partes no.
  #4 (permalink)  
Antiguo 29/06/2013, 13:05
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 12 años, 5 meses
Puntos: 28
Respuesta: (C++11) Duda sobre los threads

Cita:
El algoritmo ya lo tengo
Tengo el algoritmo, aunque lo pruebo en sudokus 2x2 (más que nada para que no me tarde):

Código C++:
Ver original
  1. bool Resolver(short Tablero[MAX][MAX])
  2. {
  3.     vector<pair<int,int> > Casillas;
  4.     for (short j = 0; j < MAX;j++)
  5.         for (short i = 0; i < MAX;i++)
  6.             if (Tablero[i][j] == 0)
  7.                 Casillas.push_back(make_pair(i,j));
  8.  
  9.     register short Inicio = Casillas.size()-1;
  10.  
  11.     short Actual;
  12.     short i;
  13.  
  14.     for (i = 0; i < Casillas.size();i++)
  15.     {
  16.             Tablero[Casillas[i].first][Casillas[i].second] = 1;
  17.     }
  18.  
  19.  
  20.     while(true)
  21.     {
  22.         for (i = 1; i < MAX;i++)
  23.         {
  24.  
  25.             Tablero[Casillas[Inicio].first][Casillas[Inicio].second] = i;
  26.  
  27.             if (Resuelto(Tablero))
  28.                 return true;
  29.         }
  30.  
  31.         Tablero[Casillas[Inicio].first][Casillas[Inicio].second] = 1;
  32.  
  33.         if (Inicio == 0)
  34.                 Inicio++;
  35.         else
  36.         {
  37.             Actual = Inicio-1;
  38.  
  39.             Tablero[Casillas[Actual].first][Casillas[Actual].second] ++;
  40.  
  41.             while (Tablero[Casillas[Actual].first][Casillas[Actual].second] > (MAX))
  42.             {
  43.                Tablero[Casillas[Actual].first][Casillas[Actual].second] = 1;
  44.  
  45.                 Actual--;
  46.                
  47.                 if (Actual == -1)
  48.                 {
  49.                     return false;
  50.                 }
  51.                 Tablero[Casillas[Actual].first][Casillas[Actual].second]++;
  52.  
  53.             }
  54.  
  55.         }
  56.  
  57.     }
  58.  
  59. }

Ahora quiero hacerlo mutihilo, tengo la idea como hacerlo (una casilla prerellenada que tiene su valor entre 9 hilos). Lo que me falta es la parte de implementación.

¿Como saber cuando un hilo ha finalizado? ¿Como paro el resto de hilos sin tener que esperar a que acabe?

Última edición por amchacon; 29/06/2013 a las 13:33
  #5 (permalink)  
Antiguo 30/06/2013, 05:04
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 12 años, 5 meses
Puntos: 28
Respuesta: (C++11) Duda sobre los threads

Hecho, había que jugar con los future:

Código C++:
Ver original
  1. future<void> t1[MAX];
  2.  
  3.     for (short i = 0; i < MAX; i++)
  4.     {
  5.         tablero[i][Inicio.first][Inicio.second] = i+1;
  6.         t1[i] = (async(launch::async,Resolver,tablero[i],ref(preparado),ref(Casillas)));
  7.     }
  8.  
  9.     short Contador;
  10.     future_status estado;
  11.  
  12.     while (true)
  13.     {
  14.  
  15.         for (short i = 0; i < MAX; i++)
  16.         {
  17.             estado =t1[i].wait_for(chrono::milliseconds(1));
  18.  
  19.             if (estado == future_status::ready)
  20.             {
  21.                 Contador = i;
  22.                 cout<<"Ganador: "<<Contador<<endl<<endl<<endl;
  23.  
  24.                 goto fin;
  25.             }
  26.         }
  27.  
  28.     }
  29. fin:

Etiquetas: int, threads
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:21.