PDA

View Full Version : [c++] dubbio usando thread


misterx
30-04-2013, 18:23
ciao,
sono in procinto di sviluppare un programma costituito da n thread i quali devono usare una funzione comune a tutti i thread. Il mio dubbio è se non uso semafori o quant'altro, potrebbe accadere che qualche thread non abbia mai accesso alla funzione condivisa?
Premetto che ogni thread richiama la funzione condivisa passando alcuni messaggi.

kwb
30-04-2013, 21:55
Per quel che ne so io, tecnicamente se non usi semafori e tutto è lasciato al caso, può succedere di tutto.

misterx
01-05-2013, 10:36
per una questione di tempo vorrei duplicare n volte un medesimo thread e cambiare solo poche cose. Durante l'esecuzione del programma, attraverso un ciclo for metterei a true o false una variabile all'interno di ogni thread in modo che utilizzino la funzione condivisa uno alla volta: vi sono controindicazioni?

thread1
{
while (var1==true)
{
..........
}

}

thread2
{
while (var2==true)
{
..........
}

}

thread3
{
while (var3==true)
{
..........
}

}

threadn
{
while (varn==true)
{
..........
}

}


grazie

Mettiu_
01-05-2013, 11:18
Scusami ma non capisco come possa funzionare questa soluzione... Immagino che quelle variabili siano settate da un altro thread esterno agli N thread. Se all'inizio sono tutte (o anche solo alcune) settate a false, fallisce la guardia del while e i threads (alcuni o tutti) terminano senza eseguire la sezione critica nemmeno una volta. Se sono settate a true, due o più thread potrebbero entrare nella sezione critica "contemporaneamente".
Tra l'altro non capisco nemmeno il senso di parallelizzare l'elaborazione se poi i thread devono eseguire in mutua esclusione. Comunque, mi sembra il tipico caso che si può risolvere con un mutex. Ogni thread fa:

pthread_mutex_lock(&mutex_condiviso);
....
.... //sezione critica
pthread_mutex_unlock(&mutex_condiviso);

Non so se ho capito bene il contesto della domanda...

kwb
01-05-2013, 11:28
Scusami ma non capisco come possa funzionare questa soluzione... Immagino che quelle variabili siano settate da un altro thread esterno agli N thread. Se all'inizio sono tutte (o anche solo alcune) settate a false, fallisce la guardia del while e i threads (alcuni o tutti) terminano senza eseguire la sezione critica nemmeno una volta. Se sono settate a true, due o più thread potrebbero entrare nella sezione critica "contemporaneamente".
Tra l'altro non capisco nemmeno il senso di parallelizzare l'elaborazione se poi i thread devono eseguire in mutua esclusione. Comunque, mi sembra il tipico caso che si può risolvere con un mutex. Ogni thread fa:

pthread_mutex_lock(&mutex_condiviso);
....
.... //sezione critica
pthread_mutex_unlock(&mutex_condiviso);

Non so se ho capito bene il contesto della domanda...
Se il problema principale è solo fermare gli altri thread e permettere solo ad uno di accedere a determinati dati/funzioni/variabili il mutex è la soluzione più semplice e migliore.
Fatto così non ci sono problemi di sorta ( basta solo stare attenti bloccare/sbloccare gli altri thread, altrimenti si rischia una deadlock.. )

misterx
01-05-2013, 18:10
Scusami ma non capisco come possa funzionare questa soluzione... Immagino che quelle variabili siano settate da un altro thread esterno agli N thread. Se all'inizio sono tutte (o anche solo alcune) settate a false, fallisce la guardia del while e i threads (alcuni o tutti) terminano senza eseguire la sezione critica nemmeno una volta. Se sono settate a true, due o più thread potrebbero entrare nella sezione critica "contemporaneamente".
Tra l'altro non capisco nemmeno il senso di parallelizzare l'elaborazione se poi i thread devono eseguire in mutua esclusione. Comunque, mi sembra il tipico caso che si può risolvere con un mutex. Ogni thread fa:

pthread_mutex_lock(&mutex_condiviso);
....
.... //sezione critica
pthread_mutex_unlock(&mutex_condiviso);

Non so se ho capito bene il contesto della domanda...

infatti vengono settate da un thread separato. Comunque era solo il mio un modo per far comprendere cosa voglio ottenere. Dato che ogni thread va specializzato in modo differente in quanto le differenze tra l'uno e l'altro sono minime in termini di inizializzazione, poi desidero che vengano eseguiti sempre in sequnenza, da A verso Z ed arrivati a Z ripartire da A.
Effettivamente ora che mi ci avete fatto pensare è meglio mettere in pausa il thread che ha già svolto il suo compito.
Non so se eistono programmi che funzionano a questo modo, una sorta di catena e se hanno problemi di funzionamento (deadlock) in primis.

tomminno
02-05-2013, 13:56
ciao,
sono in procinto di sviluppare un programma costituito da n thread i quali devono usare una funzione comune a tutti i thread. Il mio dubbio è se non uso semafori o quant'altro, potrebbe accadere che qualche thread non abbia mai accesso alla funzione condivisa?
Premetto che ogni thread richiama la funzione condivisa passando alcuni messaggi.

Una funzione di per sé non ha problemi ad essere usata in multithread, quello che può creare problemi sono i dati utilizzati dalla funzione e che risulterebbero condivisi tra i vari thread. Se la funzione usa solo variabili locali ogni variabile viene istanziata nel contesto del thread che la richiama e pertanto non hai problemi di concorrenza.

misterx
02-05-2013, 14:16
Una funzione di per sé non ha problemi ad essere usata in multithread, quello che può creare problemi sono i dati utilizzati dalla funzione e che risulterebbero condivisi tra i vari thread. Se la funzione usa solo variabili locali ogni variabile viene istanziata nel contesto del thread che la richiama e pertanto non hai problemi di concorrenza.

scusa ma non ho capito: ho uan funzione chiamata da tutti i thread che invia messaggi attraverso socket, chi regola il traffico delle varie chiamate in questo caso ?

tomminno
02-05-2013, 16:02
scusa ma non ho capito: ho uan funzione chiamata da tutti i thread che invia messaggi attraverso socket, chi regola il traffico delle varie chiamate in questo caso ?

Se la funzione apre (e chiude) un socket tutte le volte che viene invocata non c'è problema ad essere utilizzata in multithread. Se questo socket invece è "globale" allora si che devi sincronizzare.

misterx
02-05-2013, 16:35
Se la funzione apre (e chiude) un socket tutte le volte che viene invocata non c'è problema ad essere utilizzata in multithread. Se questo socket invece è "globale" allora si che devi sincronizzare.

nel mio caso allora devo sincronizzare

grazie :)