2011-02-10 15 views
8

Sto provando a scrivere un programma multi-thread, il numero di thread basato sull'input da riga di comando, e quindi non posso hardcriptare i thread pre-dichiarati. È un modo valido per farlo?Come generare n thread?

int threads = 5; // (dynamic, not hard-coded) 
int i = 0; 
pthread_t * thread = malloc(sizeof(pthread_t)*threads); 

for (i = 0; i < threads; i++) { 
    pthread_t foobar; 
    thread[i] = foobar; // will this cause a conflict? 
} 

for (i = 0; i < threads; i++) { 

    int ret = pthread_create(&thread[i], NULL, (void *)&foobar_function, NULL); 

    if(ret != 0) { 
     printf ("Create pthread error!\n"); 
     exit (1); 
    } 
} 

Ecco il mio risultato di modifiche suggerite di seguito. Sembra funzionare bene.

int threads = 5; 
int i; 

pthread_t * thread = malloc(sizeof(pthread_t)*threads); 

for (i = 0; i < threads; i++) { 

    int ret = pthread_create(&thread[i], NULL, &foobar_function, NULL); 

    if(ret != 0) { 
     printf ("Create pthread error!\n"); 
     exit (1); 
    } 
    // pthread_join(thread[i], NULL); // don't actually want this here :) 
} 

sleep(1);  // main() will probably finish before your threads do, 
free(thread); // so we'll sleep for illustrative purposes 
+2

non si può semplicemente assegnare un intero ad una stringa nel bit 'int threads = argv [3]'. Devi usare 'atoi' o sscanf –

+0

grazie, hai ragione. fisso. –

+0

Bene, con 'pthread_join()' è dove si trova, devi creare il thread, e quindi attendere che finisca prima di spawnare il prossimo. Quindi in effetti sarai quasi single-threaded qui :) –

risposta

7

Cosa c'è nel primo ciclo? Imposta gli elementi dell'array sul valore non inizializzato?

Quindi penso che è quello che vi serve:

int threads = 5, i = 0, ret = -1; 

pthread_t * thread = malloc(sizeof(pthread_t)*threads); 

for (i = 0; i < threads; i++) { 

    ret = pthread_create(&thread[i], NULL, &foobar_function, NULL); 

    if(ret != 0) { 
     printf ("Create pthread error!\n"); 
     exit (1); 
    } 
} 

depone le uova fili discussioni, a partire foobar_function in ciascuno. E tu hai (se tutto va bene :)) i loro id nella matrice thread. Quindi, ad esempio, è possibile annullare il secondo thread chiamando pthread_cancel(thread[1]) ecc.

+0

@Brian D: La funzione per il thread specificato come terzo parametro a 'pthread_create()'. –

+0

Sì, credo che sia quello che sto cercando di fare. Nell'esempio che sto seguendo, poiché è un numero statico di pthreads, scrivono semplicemente 'pthread_t t1;' e 'pthread_t t2;' e poi li inizializzano dopo con due funzioni diverse, quindi sto cercando di capire come crea dinamicamente n thread. –

+0

@Brian D: Quindi salta quella parte (dato che la natura di pthread_t è sconosciuta, non è possibile impostarla su alcun tipo di indefinito). Ottieni gli id ​​dei thread (e avvia anche i thread) nel secondo ciclo. –

1

Il primo ciclo for non è valido C, e non sono sicuro di ciò che si desidera che faccia. Basta rimuovere e il resto del codice sembra ok, a parte il cast non corretto su foobar_function. Il cast dovrebbe essere:

(void *(*)(void *))foobar_function 

ma a meno che il tipo è già presente, o qualcosa di molto vicino, il programma probabilmente è indefinito comportamento. Sarebbe meglio fissare la firma della funzione in modo che non sia necessario il cast.

+0

sì, hai ragione, grazie. –

-2

Se si sta tentando di scrivere un programma con multithreading, ma non si capisce come allocare una struttura di dati di dimensioni dinamiche, è possibile che si stiano facendo cose errate.

Impara a camminare prima di correre.

Considerare l'utilizzo di un linguaggio più semplice ed evitare l'uso di thread (espliciti).

I thread sono molto difficili da utilizzare correttamente; array di dimensioni dinamiche sono molto facili da ottenere (anche abbastanza facilmente in C)

+0

C'è poca scelta nella lingua o l'uso di thread espliciti quando si tratta di un compito a casa :) –

Problemi correlati