il problema è nel seguente:Usando della variabile condivisa dal 10 pthreads
Voglio scrivere un breve programma che crea 10 thread e ogni stampa un battistrada "id" che viene passata a infilare funzione puntatore.
codice completo del programma è qui sotto:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
struct params {
pthread_mutex_t mutex;
int id;
};
typedef struct params params_t;
void* hello(void* arg){
int id;
pthread_mutex_lock(&(*(params_t*)(arg)).mutex);
id = (*(params_t*)(arg)).id;
pthread_mutex_unlock(&(*(params_t*)(arg)).mutex);
printf("Hello from %d\n", id);
}
int main() {
pthread_t threads[10];
params_t params;
pthread_mutex_init (¶ms.mutex , NULL);
int i;
for(i = 0; i < 10; i++) {
params.id = i;
if(pthread_create(&threads[i], NULL, hello, ¶ms));
}
for(i = 0; i < 10; i++) {
pthread_join(threads[i], NULL);
}
return 0;
}
L'uscita presunta è (non è necessario in questo ordine):
Hello from 0
....
Hello from 9
risultato Attuale è:
Hello from 2
Hello from 3
Hello from 3
Hello from 4
Hello from 5
Hello from 6
Hello from 8
Hello from 9
Hello from 9
Hello from 9
I ho provato a posizionare mutex in diversi punti nella funzione hello()
, ma non è stato di aiuto.
Come devo implementare la sincronizzazione dei thread?
MODIFICA: Il risultato non è necessario 0 ... 9 può essere una qualsiasi combinazione di questi numeri, ma ognuno deve apparire solo una volta.
Anche con l'utilizzo suggerito da voi, l'OP potrebbe ancora ottenere gli stessi risultati che sta ottenendo ora. Mi sto perdendo qualcosa? – Jay
@ Jay, ho aggiornato il codice per mostrare meglio l'utilizzo. Ma hai ragione, ogni thread non ha il suo valore e il valore che hanno dipende quando chiamano getId() – Brady
@Jay, ho trovato un modo migliore per farlo senza dover creare un'istanza param per thread: solo incrementare l'id dall'interno del thread. – Brady