|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
[concorrenza] rispettare ordine avvenimenti
supponiamo di avere un software multithreaded che gestisce eventi provenienti da diverse sorgenti. ogni sorgente è interrogata continuamente da un thread ad essa dedicato che si occupa di generare e lanciare i messaggi corrispondenti agli eventi generati dalla sorgente stessa.
essendoci N sorgenti ci saranno N thread responsabili della genrazione di eventi logici. il problema nasce nel momento in cui è importante mantenere l'ordine in cui gli eventi fisici vengono generati: supponiamo che al tempo t0 la sorgente s0 generi l'evento e_s0. il thread t0 che ascolta s0 inizia la generazione dell'evento logico corrsipondente a s0, ma viene interrotto perché il sistema passa a eseguire il thread t1 associato alla sorgente s1 la quale genera a sua volta un evento e_s1 rilevato da t1. Ora, nulla vieta che t1 lanci l'evento e_s1 PRIMA del lancio dell'evento e_s0 da parte di t0 invertendo l'ordine degli eventi. neppure sincronizzare i thread funziona in quanto t0 potrebbe sospendersi prima di riuscire ad acquisire il lock di sincronizzazione. resta la strada della rimozione del parallelismo: un solo thread acquisisce in polling le N sorgenti, ma anche questa soluzione (peraltro non ottimale dal punto di vista della "semplicità" dell'implementazione degli ascoltatori di eventi) può portare al sovvertimento dell'ordine degli eventi (se il tempo che intercorre tra l'ultima lettura della sorgente s0 e la lettura di una sorgente sX è tale che in quel lasso di tempo s0 possa generare un evento seguito da un evento generato da sX, l'ordine degli eventi risulterà ancora una volta errato). esiste una trattazione di questo tipo di problemi? grazie infinite |
|
|
|
|
|
#2 |
|
Junior Member
Iscritto dal: Feb 2003
Messaggi: 8
|
Ciao,
potresti usare una coda in cui inserire le varie sorgenti, e poi, ad ogni inserimento, segnalare ad un altro thread che c'è una nuova sorgente da elaborare (questo thread si occupa di generare l'evento rimuovento la sorgente dalla coda). In altre parole: gli N thread inseriscono in coda le N sorgenti, un altro thread si occupa di estrarre le sorgenti dalla coda e scatenare gli eventi. In questo modo gli eventi seguono l'ordine di arrivo delle sorgenti. Spero di essere stato chiaro. ps: ovviamente l'accesso alla coda deve essere sincronizzato Ultima modifica di AlbertE : 29-10-2007 alle 12:45. |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
|
|
|
|
|
|
|
#4 |
|
Junior Member
Iscritto dal: Feb 2003
Messaggi: 8
|
Ho appena aggiunto un ps...
L'inserimento in coda deve essere atomico e sincronizzato. Quando un thread riceve una sorgente acquista un lock sulla coda e inserisce, poi rilascia il lock. Nella coda ci sono quindi le sorgenti in ordine di arrivo che poi vengono elaborate dall'altro thread. ok? |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Fintanto sei tu che vai a leggere i valori, (e non sono i valori "a farsi vivi") la soluzione non e' banalissima...
come vengono generati quegli eventi ? Che linguaggio usi ?
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
|
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
sul linguaggio stendiamo un velo pietoso: sono obbligato a usare labview in ogni caso, mi interessa anche la soluzione nel caso di un linguaggio come java o c#... ma per sfruttare gli interrupt hardware l'unica è scrivere un driver, giusto? |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
In C potresti probabilmente usare una select(2) (ovviamente in un singolo thread) per operare sul primo descrittore con dati disponibili. Questo dovrebbe garantirti l'ordine cronologico, e comunque difficilmente riusciresti a fare di meglio. Non conosco labview per cui non so se esistano funzionalita' analoghe.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
|
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Un solo thread riceve le richieste e le mette in coda associandovi un timestamp... La gestione degli eventi a questo punto può avanzare anche parallelamente, basta che ti porti dietro il timestamp per poter riorganizzare i dati prodotti della gestione degli eventi alla fine dell'elaborazione... |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
|
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
E' chiaro che se le sorgenti sono parallele e non producono un timestamp non sarà possibile riordinare esattamente gli eventi
In ogni caso nel modo in cui ti ho detto io ti permette di ordinarli secondo l'ordine in cui sono stati letti, permettendo comunque una elaborazione parallela. |
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
beh, grazie della conferma dei miei sospetti. cercherò il miglior compromesso grazie mille a tutti per i vostri interventi |
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
L'unico modo è togliere il parallelismo alle sorgenti...ad esempio tramite un driver che reagisce ad un IRQ...in questo modo in kernel mode ci entra un evento alla volta e la coda la puoi creare lì'...
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
comunque grazie infinite per l'aiuto |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
inoltre una delle sorgenti è un canale tcp/ip quindi non saprei proprio come interfacciarmi con il network stack di win per riceverne eventuali eventi di basso livello Ultima modifica di mad_hhatter : 29-10-2007 alle 16:05. |
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ma sono dei sensori ? Come sono collegati alla macchina ?
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
ho un dispositivo di acquisizione su porta seriale, una batteria di sensori collegati a un microcontrollore che interrogo tramite un'altra seriale e infine un connessione tcp/ip con un software che mi genera eventi lato utente
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
e se io suddividessi il tempo in slot di X ms e all'inizio di ogni slot campionassi tutte le sorgenti e generassi gli eventi in base alla "priorità" della sorgente stessa? potrebbe essere una soluzione ragionevole...
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:25.




















