You are right: A ordem de criação and the ordem de execução threads are not the same! And this is not a mistake, but the natural behavior of pthreads.
It’s not good practice to keep making conversions (casts) of integer values for pointers and vice versa, this may be the motivator of the error you mentioned in your question.
Here is an example (tested) demonstrating how to use a technique in which a context is created for each thread and its pointer passed from the main thread to the daughter threads (and vice versa) very flexibly and without dangerous conversions:
#include <stdio.h>
#include <pthread.h>
#define N (10)
typedef struct thread_context_s {
pthread_t tid;
int id;
int status;
} thread_context_t;
void * fnThread(void* arg){
thread_context_t * ctxt = (thread_context_t*) arg;
printf("Executando tarefa id: %d\n", ctxt->id );
ctxt->status = ctxt->id;
return ctxt;
}
int main(void) {
int i = 0;
thread_context_t ctxt[N];
for( i = 0; i < N; i++ ) {
ctxt[i].id = i;
if(pthread_create( &ctxt[i].tid, 0, fnThread, (void*) &ctxt[i] )) {
printf("Erro ao criar tarefa id: %d\n", i );
return 1;
}
printf("Lancou tarefa id: %d\n", i );
}
for( i = 0; i < N; i++ ) {
if(pthread_join( ctxt[i].tid, NULL )) {
printf("Erro ao esperar por tarefa id: %d\n", ctxt[i].id );
return 2;
}
printf("Tarefa id: %d retornou: %d\n", ctxt[i].id, ctxt[i].status );
}
return 0;
}
Compiling:
$ gcc -Wall -Wextra -pthread thread.c -o threads
Testing:
./threads
Lancou tarefa id: 0
Lancou tarefa id: 1
Lancou tarefa id: 2
Lancou tarefa id: 3
Executando tarefa id: 0
Lancou tarefa id: 4
Lancou tarefa id: 5
Executando tarefa id: 2
Lancou tarefa id: 6
Executando tarefa id: 3
Lancou tarefa id: 7
Executando tarefa id: 1
Lancou tarefa id: 8
Executando tarefa id: 4
Executando tarefa id: 7
Lancou tarefa id: 9
Tarefa id: 0 retornou: 0
Tarefa id: 1 retornou: 1
Executando tarefa id: 8
Tarefa id: 2 retornou: 2
Tarefa id: 3 retornou: 3
Executando tarefa id: 9
Executando tarefa id: 6
Tarefa id: 4 retornou: 4
Executando tarefa id: 5
Tarefa id: 5 retornou: 5
Tarefa id: 6 retornou: 6
Tarefa id: 7 retornou: 7
Tarefa id: 8 retornou: 8
Tarefa id: 9 retornou: 9