Autor
|
Tema: Duda con threads (Leído 9,678 veces)
|
patilanz
Desconectado
Mensajes: 481
555-555-0199@example.com
|
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: #include <thread> #include <stdio.h> #include <thread> #include <iostream> using namespace std; void hilo(int n){ int i=0; while(i<100){ i++; cout << "Thread " << n << " :" << i << endl; } } int main(int argc, char ** argv){ thread test(hilo,1); test.join(); thread test2(hilo,2); test2.join(); getchar(); }
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
Mensajes: 1.309
Galletaaa!!!
|
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
Mensajes: 481
555-555-0199@example.com
|
En mi caso no se ejecutan de forma aleatoria porque va todo seguido como en dos whiles seguidos.
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
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í: thread test(hilo,1); test.join(); thread test2(hilo,2); test2.join();
Ponlo así: thread test(hilo,1); thread test2(hilo,2); test.join(); 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
|
|
|
|
patilanz
Desconectado
Mensajes: 481
555-555-0199@example.com
|
Gracias ahora funciona perfecto 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
Mensajes: 1.211
|
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(): thread t(hilo); t.detach();
Pero pocos son los casos que es necesario tirar por ahí. 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. 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: thread t(hilo); t.join(); t = thread(hilo2); // move contructor
|
|
|
En línea
|
|
|
|
patilanz
Desconectado
Mensajes: 481
555-555-0199@example.com
|
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. void newClient(SOCKET &socket_s,SOCKET &socket_c,sockaddr_in &client){ cout << "Socket from: " << inet_ntoa(client.sin_addr) << endl; char buffer[512]; int result=recv(socket_c,buffer,sizeof(buffer),0); if(result==-1) return (void)WSAGetLastError(); cout << buffer; } thread(newClient,socket_s,socket_c,client);
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
Mensajes: 3.412
ASMático
|
Asegúrate de hacerle .join() o .detach() al thread.
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
Hay varios errores ahí. El primero esque no asignas ningun identificador para el objeto thread: 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í: thread unHilo(newClient,ref(socket_s),ref(socket_c),ref(client));
|
|
|
En línea
|
|
|
|
patilanz
Desconectado
Mensajes: 481
555-555-0199@example.com
|
Gracias ahora funciona. La documentacion thread es algo mala en ningun lugar pone lo de ref() Y una ultima pregunta 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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[SOLUCIONADO] [Duda] De Threads, Swing, y Non Blocking Calls
Java
|
RyogiShiki
|
1
|
2,971
|
15 Noviembre 2011, 14:56 pm
por RyogiShiki
|
|
|
Duda con pool de threads en java
Java
|
xoker
|
0
|
1,675
|
11 Enero 2014, 20:50 pm
por xoker
|
|
|
Duda sobre threads (hilos) y semáforos (mutex)
Programación C/C++
|
IngenieroFrustrado
|
3
|
3,003
|
25 Enero 2014, 11:17 am
por amchacon
|
|
|
Duda con threads o hilos
Java
|
.:UND3R:.
|
1
|
2,428
|
14 Febrero 2014, 17:59 pm
por Gh057
|
|
|
threads , duda
« 1 2 »
Java
|
omar_cdg
|
11
|
5,654
|
10 Septiembre 2015, 17:45 pm
por Ur1cchio
|
|