elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Detener thread en C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Detener thread en C++  (Leído 4,729 veces)
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Detener thread en C++
« en: 24 Agosto 2015, 10:58 am »

Hola, antes de meterme en Mutex etc, quería saber si se puede detener de esta manera un thread en C++, o apartir de una funcion externa que busque un valor la devuelva, y apartir de ese nuevo valor, haga false la condicion de bucle del thread y salga de este.

Probé con un volatile bool y con una variable global pasandola como argumento a la funcion del thread, pero creo que una vez pasada como argumento la funcion la trata como variable estática, luego si la cambio en otra parte del código no influye en el valor de la función del thread.

Código
  1. bool on = true;
  2. thread ok(trabaja, on, a);//hay que pasarle el bool a través de una funcion
  3. system("pause");
  4. on=false;
  5. ok.get();
  6. cout << "yano hay thread!!";

Código
  1. trabaja (bool on, string a)
  2. {
  3. while(on){
  4. /...
  5. }
  6. }
Visto que eso no funciona, pensé en crear una función que busque el valor externo y lo devuelva, pero a primeras no se me ocurre nada, seguiré pensando en ello.

Y sino con mutex como se podría hacer?

Saludos.


« Última modificación: 24 Agosto 2015, 10:59 am por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Detener thread en C++
« Respuesta #1 en: 24 Agosto 2015, 13:32 pm »

El código es incorrecto. Le tienes que pasar el bool como referencia, sinó tendrá un valor inmutable.

Código
  1. thread ok(trabaja, &on, a);
  2.  
  3. trabaja(bool *on, string a)

o


Código
  1. thread ok(trabaja, ref(on), a);
  2.  
  3. trabaja(bool &on, string a)

"ok.get()"? "ok.join()"


En línea

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Detener thread en C++
« Respuesta #2 en: 24 Agosto 2015, 14:08 pm »

Gracias socio, problema resuelto.

Luego para salir del bucle sería con el asterisco:

Código
  1. while(*on){..}

Saludos y gracias.  :) ;)
En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Detener thread en C++
« Respuesta #3 en: 6 Septiembre 2015, 13:49 pm »

A todo esto, e pregunto ahora, ¿porque usar mutex si con esto podríamos hacer lo mismo y de manera más sencilla sin producir tantos errores?

Ya que para controlar la entrada a la ejecucion de un code con mutex lo que hacia era esperar a que se desbloquee haciendo un Sleep(10) en un bucle y cuando este accesible entre al codigo pero aun asi no me funcionaba a veces, empiezo a pensar que es mejor hacerlo con variables como bool como exponemos en este tema:

Código
  1. while (*on_mitm)
  2. {
  3. if (control.try_lock())
  4. {
  5. //haz cosas
  6. control.unlock();
  7. //duerme Sleep(TIEMPO);
  8. }
  9. Sleep(10);
  10. }
En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
someRandomCode

Desconectado Desconectado

Mensajes: 250



Ver Perfil
Re: Detener thread en C++
« Respuesta #4 en: 6 Septiembre 2015, 14:04 pm »

Los mutex se usan cuando hay datos que son compartidos entre threads y no se pueden modificar en un momento dado del tiempo dado que el valor critico se encuentra en otro thread distinto del actual, entonces se bloquea con un mutex o un semaforo hasta que el estado sea el deseado..

Ejemplo:
5 threads calculando sumas, todos los threads comparten una variable estatica con el resultado final, unos terminan primero y otros terminan despues de computar, cuando termina el ultimo, se suman todos los datos para evitar perdidas.
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Detener thread en C++
« Respuesta #5 en: 6 Septiembre 2015, 14:17 pm »

No necsitas usar try_lock + sleep. Usa lock() y ya. Lock lo pone en la lista de espera. Con try_lock solo mira si está libre.
En línea

someRandomCode

Desconectado Desconectado

Mensajes: 250



Ver Perfil
Re: Detener thread en C++
« Respuesta #6 en: 6 Septiembre 2015, 14:23 pm »

Lo bueno de usar try_lock en vez de lock es que el recibe un int con el numero de thread que no se pudo bloquear, como para reintentar, o terminar si el thread se va rogue (sin control)
En línea

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Detener thread en C++
« Respuesta #7 en: 6 Septiembre 2015, 16:47 pm »

Buenas gracias por las respuestas,

Básicamente usaba el mutex para coordinar varios async que ejecuta un solo thread, que es ejecutado de entre otros thread en el main.

Este thread se encarga de realizar un MITM sobre la red local, mediante ARP Spoofing, lo primero que hace es un escaneo y si hay hosts comienza un async() que los envenena, otro async que cada X tiempo reescanea la red en busca de nuevos hosts y que elimina los que se desconectaron. Tambien otro async se encarga de redirigir los paquetes y filtrarlos para poder obtener los datos de la red, en total son 3. ¿Qué tienen en común?, el adaptador de la interfaz de red, usé mutex para que si hay uno usando ese adaptador no lo usen los otros por se acaso inducía a error pero no sé si llegaría a ocurrir este error.

Estoy hablando de un pcap_t* a través de esa variable envío y recojo paquetes de la red, si la estoy usando en varios procesos, ¿sería necesario un mutex?

Edito: Vaya no sabía eso ivancea, pero creo que lo cambié porque al haber 3 subprocesos usando el mutex, al hacer lock() en 2 a la vez cascaba pues no sabía a cual de los 2 dárselo, pero si lo que dices funciona me ahorraría bastante code.

Saludos.
« Última modificación: 6 Septiembre 2015, 16:48 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Detener thread en C++
« Respuesta #8 en: 6 Septiembre 2015, 16:52 pm »

Citar
al hacer lock() en 2 a la vez cascaba pues no sabía a cual de los 2 dárselo

Extraño.

Lo que sí, los locks del mutex trata de hacerlos solo en los puntos donde realmente los necesitas. Evita poner código de más dentro del mutex. Solo las partes que van a acceder a datos que peligran. Sinó, aumentará el tiempo que los threads están bloqueados, que viene siendo un descenso del rendimiento.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda con los Thread
Programación Visual Basic
ricardovinzo 1 1,507 Último mensaje 16 Enero 2009, 13:12 pm
por seba123neo
Problema con Thread
Java
1mpuls0 6 4,170 Último mensaje 8 Abril 2010, 01:31 am
por egyware
#include <thread/AsyncCallback.h> #include <thread/Runnable.h>
GNU/Linux
Codename!! 1 2,888 Último mensaje 18 Agosto 2011, 07:14 am
por Foxy Rider
#include <thread/AsyncCallback.h> #include <thread/Runnable.h>
Programación C/C++
Codename!! 0 2,102 Último mensaje 15 Agosto 2011, 21:31 pm
por Codename!!
Detener un thread y volver a empezar de 0.
.NET (C#, VB.NET, ASP)
GonzaFz 0 1,352 Último mensaje 15 Junio 2012, 00:51 am
por GonzaFz
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines