|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
[c++] dubbio usando thread
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. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
|
Per quel che ne so io, tecnicamente se non usi semafori e tutto è lasciato al caso, può succedere di tutto.
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
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 |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Jul 2011
Messaggi: 246
|
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...
__________________
Non c'è cosa peggiore nella vita di un programmatore di un errore che si presenta solo ogni tanto. CONCLUSO POSITIVAMENTE CON: oldfield Ultima modifica di Mettiu_ : 01-05-2013 alle 11:23. |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
|
Quote:
Fatto così non ci sono problemi di sorta ( basta solo stare attenti bloccare/sbloccare gli altri thread, altrimenti si rischia una deadlock.. )
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
|
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
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. |
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
|
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
|
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
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.
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:01.