|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 1345
|
[C]Consiglio su semafori per sincronizzazione di due task
Volevo avere un parere su l'implementazione di due semafori per sincronizzare la lettura di una risorsa che viene continuamente aggiornata.
la mia situazione è che task1 e task2 leggono una variabile che un task3 aggiorna. Dovrei trovare il modo di far leggere ai due task lo stesso valore nel caso in cui uno dei due dovesse essere schedulato in maniera diversa Avevo pensato di fare cosi con due mutex letto a 0 e possoleggere a 1 Task1 wait su possoleggere legge la risorsa signal su possoleggere signal su letto Task2 wait su possoleggere wait su letto legge la risorsa signal possoleggere signal su letto il task3 invece non puo' essere toccato per specifiche date... Secondo voi concettualmente è corretto? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Dalla descrizione non e' chiaro se task3 ha gia' un meccanismo di sincronizzazione o di notifica dell'aggiornamento della variabile.
Il tuo pseudocodice e' un po' strano, ma forse quello strano sono io. Perche' due signal su possoleggere e letto? La mia proposta e' piu' semplice: altro thread, chiamiamolo dispatcher. Sarebbe opzionale ma concettualmente e' piu' carino. Dispatcher legge da thread 3, ed ha bisogno di farlo una sola volta. Poi spedisce il valore letto ai due thread, ciascuno affacciato ad una coda/pipe/socket/memoria condivisa/array sincronizzato/... per capirci, il thread dispatcher fara': while (!finito) { val = leggi_valore(); /* Supponiamo che resti bloccato qui fino al prossimo valore */ send(queue1, val); send(queue2, val); } Ovviamente se non vuoi introdurre un nuovo thread, puoi assegnare questo lavoro ad uno degli altri due (i.e. legge e spedisce all'altro). Probabilmente e' lo stesso, ma mi sembra piu' semplice e 'pulito' da gestire...
__________________
In God we trust; all others bring data |
![]() |
![]() |
![]() |
#3 | ||||
Senior Member
Iscritto dal: Dec 2005
Messaggi: 1345
|
Quote:
Innanzitutto grazie per la risposta. In realtà sono io che ho semplificato troppo la spiegazione del mio problema quindi credo che sia io quello strano xDxD Ti spiego meglio la problematica. Allora ho un task3 che non posso toccare perchè simula un sensore in un processo che mi aggiorna costantemente i valori di un ipotetico sistema. Ora ho due task che devono leggere i valori contemporaneamente dalla variabile in comune perchè rappresentano i dispositivi incaricati di acquisire i valori dal sensore. Il mio problema è che se capita una schedulazione particolare, devo far in modo che i due task adibiti all'acquisizione leggano lo stesso valore. Tutto ciò senza toccare il task "sensore" Quote:
![]() Quote:
Quote:
Ti ringrazio perchè non riuscivo ad elaborare una soluzione con questo tipo di suggerimento che mi hanno dato! Adesso provo ad implementarlo e ti faccio sapere se sono riuscito nell'intento!! |
||||
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 1345
|
Alla fine ho risolto come mi hai consigliato solo che ho dovuto fare alcune modifiche per rispettare alcune specifiche che mi erano state date....
Grazie mille!!! ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:20.