2011-11-22 6 views
8

Sto provando a passare due parametri a un thread in C. Ho creato un array (di dimensione 2) e sto provando a passare quell'array nel thread. È questo l'approccio giusto per passare più parametri in un thread?Come passare più parametri a un thread in C

// parameters of input. These are two random numbers 
int track_no = rand()%15; // getting the track number for the thread 
int number = rand()%20 + 1; // this represents the work that needs to be done 
int *parameters[2]; 
parameters[0]=track_no; 
parameters[1]=number; 

// the thread is created here 
pthread_t server_thread; 
int server_thread_status; 
//somehow pass two parameters into the thread 
server_thread_status = pthread_create(&server_thread, NULL, disk_access, parameters); 
+1

Verificare la normativa si dichiara un array di puntatori a int e l'assegnazione loro con valori int. – Teudimundo

+0

Ho notato quell'avvertimento. Sarebbe legittimo se i parametri non fossero puntatori e semplicemente un array? –

+0

se dichiari che il parametro è un array di int ("int parameter [2];"), puoi passare il parametro come puntatore. È il puntatore al primo int. È quindi possibile accedervi dal thread come una matrice. – Teudimundo

risposta

15

Dal momento che si passa in un puntatore nullo, si può puntare a qualsiasi cosa, compresa una struttura, come da esempio seguente:

typedef struct s_xyzzy { 
    int num; 
    char name[20]; 
    float secret; 
} xyzzy; 

xyzzy plugh; 
plugh.num = 42; 
strcpy (plugh.name, "paxdiablo"); 
plugh.secret = 3.141592653589; 

status = pthread_create (&server_thread, NULL, disk_access, &plugh); 
// pthread_join down here somewhere to ensure plugh 
// stay in scope while server_thread is using it. 
+3

Ovviamente, nel codice mostrato nell'esempio precedente, è necessario assicurarsi che la struttura non venga distrutta mentre il thread tenta di dereferenziare l'opratore specificato. –

+0

La soluzione più semplice è quella di 'malloc' la struttura e rendere il nuovo thread responsabile della sua liberazione. Un altro approccio consiste nel mettere una barriera all'interno della struttura e fare in modo che il thread originale e quello nuovo attenderanno sulla barriera prima che il thread originale ritorni. –

+0

@FrerichRaabe Forse una domanda stupida, ma in che modo la struttura "viene distrutta" ... a parte una chiamata a 'free()' (se era 'malloc'ed) o alla funzione di ritorno (se è stata allocata sul stack), c'è qualche altro modo? – The111

1

Questo è un modo. L'altro solito è passare un puntatore a un struct. In questo modo puoi avere diversi tipi di "parametri", ei parametri sono nominati piuttosto che indicizzati, il che può rendere il codice un po 'più facile da leggere/seguire a volte.