O que fazer.

O que fazer.

Estou tendo alguns problemas para gerar meus threads na ordem correta. Meu programa precisa levar pelo menos 2 parâmetros (pode ser mais, mas sempre 2 por vez porque um é inteiro (quantos segundos o thread espera) e o outro é char*(apenas uma mensagem normal)). A saída do programa é o número do thread (índice) e a mensagem do segundo parâmetro, mas os threads precisam ser classificados com base no tempo que tiveram desde o primeiro parâmetro. O thread principal precisa esperar por todos os outros threads. Serão no máximo 10 tópicos.

#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 é o meu código. Quando insiro os parâmetros do código:

300 este_é_último 100 este_é_primeiro 200 este_é_meio

A saída deve ser assim:

Thread 2 : this_is_first
Thread 3 : this_is_middle
Thread 1 : this_is_last

Mas com meu código eu recebo isso:

Thread 1 : this_is_last
Thread 2 : this_is_first
Thread 3 : this_is_middle

Sou novo em threads e realmente não sei como consertar isso.

Responder1

Olhando para o código. Não há saída nos threads. Portanto, o threading não faz nada. Você pode remover o create_thread, e isso serviráexatamentea mesma coisa.

A saída estará em ordem sequencial. Com tempos variados (de acordo com os parâmetros pares).

Além disso, cada thread é chamado thread_main.

O que fazer.

Coloque o atraso variável e printfem thread_main. (E dê um nome melhor). Você então tem que passar a mensagem e o ID para o tópico.

Vermanualpara obter um exemplo de como fazer isso. Nota tinfosendo passada para o tópico.

Eu começaria tendo 3 rotinas, uma para cada thread, com mensagens e IDs diferentes. Quando isso estiver funcionando, comece a explorar como passar informações para eles na inicialização.

informação relacionada