Hilos

Iniciado por digimikeh, 8 Julio 2020, 04:29 AM

0 Miembros y 1 Visitante están viendo este tema.

digimikeh

Buenas noches...

Entiendo a modo muy general el tema de los hilos...
Al ejecutar el programa no está ejecutando ambos hilos al mismo tiempo, sino que ejecuta h1, espera a que termine y luego ejecuta h2... como logro que se ejecuten ambos a la vez?, entiendo que debo usar mutex para que no haya resultado inesperado con std::cout lo tengo en cuenta.. pero independiente de eso, mi objetivo es ejecutar los dos hilos a la vez. Saludos y gracias.



#include <iostream>
#include <thread>

int main(){
    std::thread h1(
                [](){ for (short x{0}; x != 11; ++x) std::cout << x << std::endl; }
    );
    h1.join();
   
    std::thread h2(
                [](){ for (short x{90}; x != 101; ++x) std::cout << x <<std::endl; }
                );
    h2.join();

    return 0;
}
Dungeons & dragons;
dragons.Attack();

ThunderCls

Exactamente el objetivo que persiguen los hilos es lograr una ejecucion concurrente (varias porciones de codigo ejecutandose al "mismo tiempo"). std::thread::join es una funcion que se usa para bloquear el hilo en la linea desde la cual es llamada y esperar a que el hilo al que se esta "joining" termine la ejecucion antes de continuar con el resto de la funcion principal. En este caso creo que es lo opuesto a lo que deseas hacer, o sea ejecutar dos porciones de codigo simultaneamente.

En tu caso moviendo h1.join(); justo despues de h2.join(); garantiza que ambos hilos se ejecuten concurrentemente. La funcion main a su vez espera que ambos concluyan antes de terminar su ejecucion.

Si te vas a adentrar en el tema de la programacion concurrente te aconsejo empezar conociendo conceptos basicos como: secciones criticas, race conditions, deadlocks, livelock, exclusion mutua (semaforos, mutex, etc)
Saludos
-[ "...I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/

digimikeh

Hola!
gracias por la respuesta...

Efectivamente ahi corrieron los dos hilos simultaneamente...

Aprovecho la instancia para preguntar: Por qué en Linux este codigo no funciona?

El mensaje que obtengo del compilador es:

/usr/include/c++/8/thread:127: error: undefined reference to `pthread_create'

Saludos y agradecido nuevamente.
Dungeons & dragons;
dragons.Attack();

ThunderCls

Asegúrate que estas compilando con -pthread
-[ "...I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/

digimikeh


Actualmente utilizo Qt Creator como IDE por lo que tengo que buscar en alguna parte donde meter el flag..

Gracias estimado por la gran ayuda..

Saludos cordiales.
Dungeons & dragons;
dragons.Attack();