es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en el uso de pthread_join en el bucle for. El primer argumento de pthread_join debe ser el ID del hilo, pero en este caso, se establece como t_status[ii], que es el valor de retorno de pthread_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) por pthread_join(t_id[ii], NULL) en el bucle for.

    for(int ii=0; ii < 2; ii+=1){
        std::cout << pthread_join(t_id[ii], NULL) << std::endl;
    }
    

    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ón sleep().

Comments are closed.