Consulta TP2 - Instrucciones no ejecutándose en orden dentro de un thread

18 views
Skip to first unread message

Andrés Fernández

unread,
Oct 30, 2020, 8:53:38 AM10/30/20
to 7542 - Taller de Programación
Buenas! Les quería hacer la siguiente consulta. Mis threads básicamente deberían seguir el siguiente procedimiento:
- Pedir un archivo (thread.pedirArchivo(repositorio))
- Validar el archivo (thread.start()) -> dentro se llama a run y se hace la validación.
- Guardar el resultado (thread.guardarArchivo(repositorio))

Más allá de que hay varios, threads, entiendo que dentro de cada thread se debería respetar el orden de las instrucciones, más allá de que se puedan intercalar las ejecuciones de los threads. Sin embargo, termina pasando lo siguiente:



Entiendo que se intercalen las operaciones de los threads, pero no entiendo por qué, para cada thread, el orden no es el siguiente:

THREAD X: OBTENIENDO ARCHIVO...
THREAD X: RUNNING
THREAD X: VALIDACION...
THREAD X: GUARDANDO RESULTADO...

Les agradezco cualquier ayuda, saludos.

Andrés Fernández

unread,
Oct 30, 2020, 8:55:26 AM10/30/20
to 7542 - Taller de Programación
No sé por qué no se ve la imagen. La adjunto.
TP_2.png

Matías Lafroce

unread,
Oct 30, 2020, 9:43:39 AM10/30/20
to tallerdepr...@googlegroups.com
thread.guardarArchivo(repositorio) imprime "GUARDANDO" ¿No?
Bueno, el tema es que vos no tenés 2 threads, tenés 3 threads intercalandose. El thread 0 es el que está lanzando esos threads (o sea, el main). Cuando vos lanzás el 1, el 0 sigue de largo. Entonces, mientras el 1 se inicializa y se ejecuta, el 0 dice "bueno, ya los lancé, ahora grabo".
Te falta esa función que hace que un hilo espere a que se termine otro para liberar su recursos.

--
Has recibido este mensaje porque estás suscrito al grupo "7542 - Taller de Programación" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a tallerdeprograma...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/tallerdeprogramacion/646a255d-8a80-487e-832b-88a05c309c06n%40googlegroups.com.

Martin Di Paola

unread,
Oct 30, 2020, 10:19:44 AM10/30/20
to tallerdepr...@googlegroups.com
Estas seguro que los prints lo hacen el mismo thread.

O sea si yo tengo:

```
void foo() {
printf("1\n");
printf("2\n");
printf("3\n");
printf("4\n");
}
```

No importa si `foo` se ejecuta en un hilo o en otro, esos prints se van
a hacer en orden.

Pensa que sino no podrias armar ningun programa por que el codigo se
mezclaria de forma random.

Te diria que empiezes borrando codigo para simplificarlo hasta que te
quede un codigo muy chico que siga reproducinedo el issue.

Tal vez te das cuenta ahi de lo que pasa. Sino, postealo (acordate que
debe ser super chico para que no sea parte de la solucion de ningun tp)

Saludos!
Martin.

On Fri, Oct 30, 2020 at 05:55:26AM -0700, Andrés Fernández wrote:
>No sé por qué no se ve la imagen. La adjunto.
>
>El viernes, 30 de octubre de 2020 a las 9:53:38 UTC-3, Andrés Fernández
>escribió:
>
>> Buenas! Les quería hacer la siguiente consulta. Mis threads básicamente
>> deberían seguir el siguiente procedimiento:
>> - Pedir un archivo *(thread.pedirArchivo(repositorio))*
>> - Validar el archivo *(thread.start()) -> dentro se llama a run y se hace
>> la validación.*
>> - Guardar el resultado *(thread.guardarArchivo(repositorio))*
>>
>> Más allá de que hay varios, threads, entiendo que dentro de cada thread se
>> debería respetar el orden de las instrucciones, más allá de que se puedan
>> intercalar las ejecuciones de los threads. Sin embargo, termina pasando lo
>> siguiente:
>>
>>
>>
>> Entiendo que se intercalen las operaciones de los threads, pero no
>> entiendo por qué, para cada thread, el orden no es el siguiente:
>>
>> THREAD X: OBTENIENDO ARCHIVO...
>> THREAD X: RUNNING
>> THREAD X: VALIDACION...
>> THREAD X: GUARDANDO RESULTADO...
>>
>> Les agradezco cualquier ayuda, saludos.
>>
>>
>
>--
>Has recibido este mensaje porque estás suscrito al grupo "7542 - Taller de Programación" de Grupos de Google.
>Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a tallerdeprograma...@googlegroups.com.
>Para ver este debate en la Web, visita https://groups.google.com/d/msgid/tallerdeprogramacion/646a255d-8a80-487e-832b-88a05c309c06n%40googlegroups.com.


Andrés Fernández

unread,
Oct 30, 2020, 10:59:01 AM10/30/20
to tallerdepr...@googlegroups.com
Hola, muchas gracias a ambos.

Es que el número de threads que se imprime es algo que yo paso por parámetro a los threads antes del start, en un ciclo anterior. O sea, entiendo que debería ser correcto ese número.

Igual por ahora pude solucionar este problema, aunque no sé si la solución sea 100% correcta, pero me surgió una nueva duda.

Yo uso un vector de punteros a una clase Validador que hereda de Thread, como en el ejemplo de la clase. Los inicializo con new. ¿Cómo libero la memoria después? Porque me está costando mucho encontrar la forma de hacerlo bien.

Lo más cerca que estuve fue a Thread ponerle un virtual ~Thread() y a Validador un ~Validador() {delete this}, pero el Valgrind me da un segmentation fault de esta forma.

No sé si la idea tal vez no es utilizar estas clases que heredan de Thread y hay que hacerlo de otra forma.


Andrés Fernández


Andrés Fernández

unread,
Oct 30, 2020, 11:10:53 AM10/30/20
to 7542 - Taller de Programación
Este último tema ya lo pude solucionar.

Matías Lafroce

unread,
Oct 30, 2020, 11:26:55 AM10/30/20
to tallerdepr...@googlegroups.com
Delete this nunca, jamás, jamás de los jamases. Dejalo para el meme nada más.
Tenés 2 opciones: Antes de llamar a delete del validador hacer un validador->join(), o poner un thread.join() en el destructor del validador. A mi me gusta más la primera opción, la segunda es RAII pero tiene sus problemas de diseño. Si andás con tiempo podés leerlo acá https://isocpp.org/files/papers/p0206r0.html


Andrés Fernández

unread,
Oct 30, 2020, 1:12:38 PM10/30/20
to 7542 - Taller de Programación
jaja perfecto, gracias. Sí, había hecho la primera y me funcionó bien.
Reply all
Reply to author
Forward
0 new messages