Los subprocesos parecen ejecutarse aleatoriamente.. Solo son confiables después de ralentizar la unión después de la creación del subproceso.
Estoy observando un comportamiento extraño usando pthreads. Ten en cuenta el siguiente código –
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <pthread.h>
#include <unistd.h>
typedef struct FOO{
int ii=0;
std::string x="DEFAULT";
}foo;
void *dump(void *x)
{
foo *X;
X = (foo *)x;
std::cout << X->x << std::endl;
X->ii+=1;
}
int main(int argc, char **argv)
{
foo X[2];
const char *U[2] = {"Hello", "World"};
pthread_t tid[2];
int t_status[2];
/*inicializar estructuras de datos*/
for(int ii=0; ii < 2; ii+=1){
X[ii].x=U[ii];
}
foo *p = X;
for(int ii=0; ii < 2; ii+=1){
t_status[ii] = pthread_create(&t_id[ii], NULL, dump, (void *)p);
std::cout << "Thread ID = " << tid[ii] << " Status = " << t_status[ii] << std::endl;
p+=1;
}
//sleep(1); /*si esto se deja comentado, uno de los hilos no se ejecuta*/
for(int ii=0; ii < 2; ii+=1){
std::cout << pthread_join(t_status[ii], NULL) << std::endl;
}
for(int ii=0; ii < 2; ii+=1){
std::cout << X[ii].ii << std::endl;
}
}
Cuando dejo comentada la llamada sleep(1) (entre la creación de los hilos y la unión), obtengo un comportamiento errático en el que solo se ejecuta aleatoriamente uno de los dos hilos.
rajatkmitra@butterfly:~/mpi/tmp$ ./foo
Thread ID = 139646898239232 Status = 0
Hello
Thread ID = 139646889846528 Status = 0
3
3
1
0
Cuando descomento sleep(1), ambos hilos se ejecutan de manera confiable.
rajatkmitra@butterfly:~/mpi/tmp$ ./foo
Thread ID = 140072074356480 Status = 0
Hello
Thread ID = 140072065963776 Status = 0
World
3
3
1
1
El pthread_join() debería detener la salida del programa hasta que ambos hilos se completen, pero en este ejemplo no puedo lograr que eso suceda sin la función sleep(). Realmente no me gusta la implementación con sleep(). ¿Alguien puede decirme si me falta algo?</unistd.h></pthread.h>
davy.ai
Parece que el problema está en el uso de
pthread_join
en el bucle for. El primer argumento depthread_join
debe ser el ID del hilo, pero en este caso, se establece comot_status[ii]
, que es el valor de retorno depthread_create()
y no el ID real del hilo. Esto podría resultar en un comportamiento indefinido y podría explicar el comportamiento errático observado.Para solucionar esto, simplemente cambie
pthread_join(t_status[ii], NULL)
porpthread_join(t_id[ii], NULL)
en el bucle for.Al hacer esto, se debería obtener el comportamiento previsto de
pthread_join()
y esto debería solucionar el problema sin necesidad de utilizar la funciónsleep()
.