• Miércoles 15 de Mayo de 2024, 16:17

Autor Tema:  ¿Cómo ejecutar sentencias concurrentes en C++?  (Leído 1377 veces)

LauraMadrid

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
¿Cómo ejecutar sentencias concurrentes en C++?
« en: Jueves 12 de Noviembre de 2009, 16:01 »
0
¡Hola! Necesito un poco de ayuda porque estoy un poco perdida con un tema. En mi programa llego a un punto en el que tengo que ejecutar dos sentencias, pero cada una tarda un poco y deberían ejecutarse más o menos a la vez. ¿¿Hay alguna manera de ejecutarlas de forma concurrente o paralela??
¡¡Gracias!!
Laura

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: ¿Cómo ejecutar sentencias concurrentes en C++?
« Respuesta #1 en: Jueves 12 de Noviembre de 2009, 16:19 »
0
si es en unix, mirate en google la función fork(); esta dividira la ejecución en 2 procesos, y seguiran desde el momento que lo ejecutastes, pero cuidado, el diseño de un algoritmo fork tiene sus cosillas...

si es en win32 , puede usar o bien _beginthread o createprocess , estas reciben una funcion y la ejecutan en paralelo.

una cosa, una vez se mete alguien en programación concurrente debe tener en cuenta todo el universo de dolor que puede representar con sus problemas de sincronización. deberias consultar google para comunicación interthread o interproceso  y deadlocks, mutex, semaphores...


suerte!

LauraMadrid

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: ¿Cómo ejecutar sentencias concurrentes en C++?
« Respuesta #2 en: Lunes 23 de Noviembre de 2009, 18:06 »
0
Efectivamente, era con hilos. Aquí me respondo, por si a alguien le es de utilidad porque es un ejemplo muy muy simple de hilos, justo lo que iba buscando, ya que no necesitaba acceder a variables compartidas ni nada de eso, solo que se ejecutaran en paralelo dos sentencias para que una no espera a que terminara la otra:

Código: Text
  1.  
  2. #include <windows.h>
  3.  
  4. DWORD WINAPI Hilo(LPVOID lpParam)
  5. {
  6.   MessageBox(0, "Mensaje", "Desde un hilo", 0);
  7.   return 0;
  8. }
  9.  
  10. void main()
  11. {
  12.   HANDLE hHilo = CreateThread(NULL, 0, Hilo, NULL, 0, NULL);
  13.   WaitForSingleObject(hHilo, INFINITE);
  14.   CloseHandle(hHilo);
  15.   MessageBox(0, "Listo", "Desde main", 0);
  16. }
  17.  
  18.  

Pero yo además necesitaba pasarle algunas variables al hilo desde el main y para eso me ha servido el siguiente código que copio aquí también. Es básicamente el mismo código pero esta vez pasándole las variables al hilo:

Primero se define la estructura que contendrá las las variables a pasar al hilo:
Código: Text
  1.  
  2. struct ThreadParams
  3. {
  4.    char character;
  5.    int border;
  6. };
  7.  
  8.  

Entonces se llama al hilo así
Código: Text
  1.  
  2. struct ThreadParams *params = (struct ThreadParams *)malloc(sizeof (struct ThreadParams));
  3. params->border = 8675309;
  4.  
  5. hThread = CreateThread (NULL, 0, ThreadProc, (LPVOID)(params), 0, &dwThreadID);
  6.  
  7.  

Y el código del hilo:
Código: Text
  1.  
  2.     DWORD WINAPI ThreadProc ( LPVOID pvoid )
  3.     {
  4.         struct ThreadParams *params = (struct ThreadParams *)pvoid;
  5.    
  6.         int temp;
  7.         temp=params->border;
  8.  
  9.         // Free the parameters
  10.         free(lpvoid);
  11.     return 0
  12.     }
  13.