Tengo algunos problemas para generar mis hilos en el orden correcto. Mi programa necesita tomar al menos 2 parámetros (podrían ser más, pero siempre 2 a la vez porque uno es un número entero (cuántos segundos espera el hilo) y el otro es char* (solo un mensaje normal)). La salida del programa es el número de hilo (índice) y el mensaje del segundo parámetro, pero los hilos deben ordenarse según el tiempo que tuvieron desde el primer parámetro. El hilo principal debe esperar a todos los demás hilos. Habrá un máximo de 10 hilos.
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
void* thread_main(void* arg){
sleep(1);
return NULL;
}
int main(int argc, char** argv){
pthread_t tid[10];
int s;
int index=0;
for(int i=1;i<argc;i+=2){
int param1= atoi(argv[i]);
char* param2= argv[i+1];
s=pthread_create(&tid[index],NULL,thread_main,NULL);
usleep(param1*1000);
printf("Thread %d : %s\n",index+1,param2);
index++;
}
for(int i=0;i<index+1;i++){
s=pthread_join(tid[i],NULL);
}
return 0;
}
Este es mi código. Cuando ingreso los parámetros para el código:
300 esto_es_el_último 100 esto_es_el_primero 200 esto_es_el_medio
La salida debería ser así:
Thread 2 : this_is_first
Thread 3 : this_is_middle
Thread 1 : this_is_last
Pero con mi código me sale esto:
Thread 1 : this_is_last
Thread 2 : this_is_first
Thread 3 : this_is_middle
Soy nuevo en los hilos y realmente no sé cómo solucionar este problema.
Respuesta1
De mirar el código. No hay salida dentro de los hilos. Por lo tanto, el subproceso no hace nada. Puedes eliminar create_thread y funcionará.exactamentela misma cosa.
La salida estará en orden secuencial. Con tiempos variables (según los parámetros pares).
Además, cada hilo se llama thread_main.
Qué hacer.
Coloque el retraso variable y el printf
en thread_main. (Y dale un nombre mejor). Luego tienes que pasar el mensaje y la identificación al hilo.
Vermanualpara ver un ejemplo de cómo hacerlo. Nota tinfo
que se pasa al hilo.
Yo empezaría por tener 3 rutinas, una para cada hilo, con diferentes mensajes e ID. Cuando esto funcione, comience a explorar cómo pasarles información al inicio.