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

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda con threads
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 Ir Abajo Respuesta Imprimir
Autor Tema: Duda con threads  (Leído 9,557 veces)
patilanz


Desconectado Desconectado

Mensajes: 481

555-555-0199@example.com


Ver Perfil WWW
Duda con threads
« en: 15 Mayo 2014, 13:33 pm »

Hola me acabo de enterar de que existe thread http://www.cplusplus.com/reference/thread/thread/

Esto me gusto porque deberia de funcionar en todos los os.
Luego probe hacer esto:

Código
  1. #include <thread>
  2. #include <stdio.h>
  3. #include <thread>
  4. #include <iostream>
  5.  
  6. using namespace std;
  7. void hilo(int n){
  8. int i=0;
  9. while(i<100){
  10. i++;
  11. cout << "Thread " << n << " :" << i << endl;
  12. }
  13. }
  14.  
  15. int main(int argc, char ** argv){
  16. thread test(hilo,1);
  17. test.join();
  18. thread test2(hilo,2);
  19. test2.join();
  20. getchar();
  21. }

Y el resultado fue como si hubiera puesto dos whiles seguidos. No deberia de mostrar se por ejemplo:

Thread 1: 1
Thread 2: 1
Thread 1: 2
...
En vez de:

Thread 1: 1
Thread 1: 2
...
Thread 1: 100
Thread 2: 1
..


O tengo confundido lo que hacen los threads?

Saludos


En línea

NikNitro!


Desconectado Desconectado

Mensajes: 1.309


Galletaaa!!!


Ver Perfil WWW
Re: Duda con threads
« Respuesta #1 en: 15 Mayo 2014, 13:47 pm »

los threads se ejecutan de forma aleatoria. No tienen por qué ocurrir siempre igual.

De todos modos no estoy seguro de que en c++ se usen así.

En Java (que es donde los estoy dando actualmente) tienes que hacer que la clase extienda de threadable y llamar a un método que es run() el cual es override.

Saludos


En línea

patilanz


Desconectado Desconectado

Mensajes: 481

555-555-0199@example.com


Ver Perfil WWW
Re: Duda con threads
« Respuesta #2 en: 15 Mayo 2014, 13:49 pm »

En mi caso no se ejecutan de forma aleatoria porque va todo seguido como en dos whiles seguidos.
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Duda con threads
« Respuesta #3 en: 15 Mayo 2014, 13:52 pm »

No hay ningún problema ahí, nadie te garantiza que un thread van a ir al mismo tiempo (depende de los núcleos físicos que tengas, la carga del sistema...).

Si quieres un orden fijo, tendrás que sincronizar los threads con los mecanismos correspondientes.



Vale lo acabo de revisar y efectivamente has metido la gamba xD.

El problema está aquí:
Código
  1. thread test(hilo,1);
  2. test.join();
  3. thread test2(hilo,2);
  4. test2.join();

Ponlo así:
Código
  1. thread test(hilo,1);
  2. thread test2(hilo,2);
  3. test.join();
  4. test2.join();

El join no es para iniciar el thread, sino para esperar a que acabe xD
« Última modificación: 15 Mayo 2014, 14:01 pm por Eternal Idol » En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
patilanz


Desconectado Desconectado

Mensajes: 481

555-555-0199@example.com


Ver Perfil WWW
Re: Duda con threads
« Respuesta #4 en: 15 Mayo 2014, 17:56 pm »

Gracias ahora funciona perfecto  ;D
Pero si es para esperar a que acabe que hace? Cuando acaba la función limpia memoria o algo así?
Puedo detectar que el thread se ha cerrado y ejecutar otra función con join?
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Duda con threads
« Respuesta #5 en: 15 Mayo 2014, 21:39 pm »

La idea es la perfecta sincronización, si vas a salir del programa tendrás que esperar a que terminen el resto de los hilos. De lo contrario podría tener efectos adversos.

La clase thread presupone que harás join en algún momento (al final del programa/funcion normalmente), si tu idea es dejar el hilo a tu aire tienes que usar detach():
Código
  1. thread t(hilo);
  2. t.detach();

Pero pocos son los casos que es necesario tirar por ahí.

Citar
Puedo detectar que el thread se ha cerrado
¿Sin usar join?

No, a no ser que te pongas un booleano de control en el hilo... Lo más natural sería el uso de condiction_variables.

Citar
y ejecutar otra función con join?
No, una vez que haz hecho join no puedes ejecutar otra funcion.

Aunque si puedes aprovecharte del move-constructor y crear otro objeto thread:
Código
  1. thread t(hilo);
  2. t.join();
  3.  
  4. t = thread(hilo2); // move contructor
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
patilanz


Desconectado Desconectado

Mensajes: 481

555-555-0199@example.com


Ver Perfil WWW
Re: Duda con threads
« Respuesta #6 en: 17 Mayo 2014, 13:17 pm »

Hola gracias por tu explicacion pero ahora tambien con los threads pero anadiendo socket de windows este codigo funciona fuera de un thread pero si lo pongo dentro de una funcion que llamo desde el thread pasando le los parametros me da error abort was called.

Código
  1. void newClient(SOCKET &socket_s,SOCKET &socket_c,sockaddr_in &client){
  2. cout << "Socket from: " << inet_ntoa(client.sin_addr) << endl;
  3. char buffer[512];
  4. int result=recv(socket_c,buffer,sizeof(buffer),0);
  5. if(result==-1)
  6. return (void)WSAGetLastError();
  7. cout << buffer;
  8. }
  9. thread(newClient,socket_s,socket_c,client);
  10.  

Si pongo el codigo directamente en la funcion main donde se hace el acept funciona pero en cambio en la funcion con el thread no.

Si llamo la funcion aparte si funciona... ??
Porque??

Saludos y gracias
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Duda con threads
« Respuesta #7 en: 17 Mayo 2014, 13:29 pm »

Asegúrate de hacerle .join() o .detach() al thread.
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Duda con threads
« Respuesta #8 en: 17 Mayo 2014, 16:49 pm »

Hay varios errores ahí.

El primero esque no asignas ningun identificador para el objeto thread:
Código
  1. thread unHilo(newClient,socket_s,socket_c,client);

Mejor asi, no te olvides después hacer un join() antes de terminar.

Por cierto, los argumentos con referencia deben de indicarse con ref. De modo que debería ser así:
Código
  1. thread unHilo(newClient,ref(socket_s),ref(socket_c),ref(client));

En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
patilanz


Desconectado Desconectado

Mensajes: 481

555-555-0199@example.com


Ver Perfil WWW
Re: Duda con threads
« Respuesta #9 en: 18 Mayo 2014, 17:19 pm »

Gracias ahora funciona. La documentacion thread es algo mala en ningun lugar pone lo de ref()

Y una ultima pregunta  ;D
Puedo hacer join del thread desde la función que llama el thread?
Lo necesito porque tengo un thread que hace los listen pero tiene que ser multiusuario por lo tanto el thread no puede tener nombre ni me puedo parar a esperar para que el thread se cierre si no que se tiene que terminar solo con join cuando el usuario se valla, esto ya lo detecto con los sockets.
En línea

Páginas: [1] 2 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[SOLUCIONADO] [Duda] De Threads, Swing, y Non Blocking Calls
Java
RyogiShiki 1 2,958 Último mensaje 15 Noviembre 2011, 14:56 pm
por RyogiShiki
Duda con pool de threads en java
Java
xoker 0 1,662 Último mensaje 11 Enero 2014, 20:50 pm
por xoker
Duda sobre threads (hilos) y semáforos (mutex)
Programación C/C++
IngenieroFrustrado 3 2,970 Último mensaje 25 Enero 2014, 11:17 am
por amchacon
Duda con threads o hilos
Java
.:UND3R:. 1 2,400 Último mensaje 14 Febrero 2014, 17:59 pm
por Gh057
threads , duda « 1 2 »
Java
omar_cdg 11 5,608 Último mensaje 10 Septiembre 2015, 17:45 pm
por Ur1cchio
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines