Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Peugeot Polygon Concept: ecco il futuro delle utilitarie
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Polygon è la concept car di Peugeot che mostra il futuro delle soluzioni del segmento B: tra design compatti e innovativi affiancati da dimensioni compatte uno scherzo dalla manovrabilità incredibile per le manovre a bassa velocità
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
OPPO ha portato in Italia, dal 1° luglio 2026, Reno16 Pro: display AMOLED da 6,32 pollici a 144Hz, tripla fotocamera con sensore principale da 200 megapixel, chip Dimensity 8550 Super e batteria da 6000mAh, al prezzo di lancio di 899 euro. Lo abbiamo provato per due settimane insieme al nuovo accessorio Bubble, per capire se la formula compatta della serie regge ancora di fronte a un listino da 1099 euro
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
MiniLED di fascia media con local dimming a 192 zone, 144 Hz nativi e audio firmato Devialet. La prova strumentale riscontra colori affidabili e gaming reattivo, per un prodotto molto accessibile e convincente. Ma la soundbar aggiuntiva è quasi d'obbligo
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 29-10-2007, 09:51   #1
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
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
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 29-10-2007, 11:40   #2
AlbertE
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 11:45.
AlbertE è offline   Rispondi citando il messaggio o parte di esso
Old 29-10-2007, 11:43   #3
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
Quote:
Originariamente inviato da AlbertE Guarda i messaggi
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.
chiarissimo, ma hai solo spostato il problema: come garantire che l'accodamento segua l'ordine reale degli eventi?
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 29-10-2007, 11:49   #4
AlbertE
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?
AlbertE è offline   Rispondi citando il messaggio o parte di esso
Old 29-10-2007, 11:55   #5
marco.r
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
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 29-10-2007, 11:57   #6
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
Quote:
Originariamente inviato da AlbertE Guarda i messaggi
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?
avevo già considerato la sincronizzazione nel mio primo post: cosa vieta che il thread che gestisce il primo (in ordine temporale) evento venga sospeso subito prima che riesca ad acquisire il lock e che il controllo passi al gestore di un evento temporalmente successivo?
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 29-10-2007, 11:59   #7
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
Quote:
Originariamente inviato da marco.r Guarda i messaggi
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 ?
purtroppo la questione nasce proprio dal fatto che non uso interrupt, ma testo in continuazione (da qui l'idea di usare più thread) se il valore letto dal sensore è cambiato.

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?
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 29-10-2007, 11:59   #8
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da AlbertE Guarda i messaggi
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?
Se il lock lo acquisisci dopo la comparsa dell'evento, non hai la garanzia che un altro thread non lo acquisisca prima di te. Dovresti acquisirlo prima ancora, ma il come dipende appunto da come vengono generati gli eventi.
__________________
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
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 29-10-2007, 12:05   #9
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da mad_hhatter Guarda i messaggi
purtroppo la questione nasce proprio dal fatto che non uso interrupt, ma testo in continuazione (da qui l'idea di usare più thread) se il valore letto dal sensore è cambiato.

sul linguaggio stendiamo un velo pietoso: sono obbligato a usare labview
Quindi immagino tu abbia N stream che forniscono il testo col valore letto dal sensore ?
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
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 29-10-2007, 12:10   #10
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
Quote:
Originariamente inviato da marco.r Guarda i messaggi
Quindi immagino tu abbia N stream che forniscono il testo col valore letto dal sensore ?
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.
ti ringrazio molto, indagherò sulla tua proposta
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 29-10-2007, 14:33   #11
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da mad_hhatter Guarda i messaggi
chiarissimo, ma hai solo spostato il problema: come garantire che l'accodamento segua l'ordine reale degli eventi?
Dovresti usare una specie di produttore (inserimento degli eventi in coda) / consumatori (gestori degli event)...
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...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 29-10-2007, 14:49   #12
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
Quote:
Originariamente inviato da cionci Guarda i messaggi
Dovresti usare una specie di produttore (inserimento degli eventi in coda) / consumatori (gestori degli event)...
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...
si, avevo pensato all'uso di un timestamp... in ogni caso la tua soluzione rientra nel caso "resta la strada della rimozione del parallelismo" del mio primo post: abbiamo un thread che ascolta in polling varie sorgenti... e non è garantito che tale thread rilevi gli eventi nell'ordine in cui sono realmente accaduti. Il timestamp sarebbe utile se fosse prodotto dalla sorgente fisica dell'evento, ma farlo produrre al thread ascoltatore è un problema della stessa classe del problema originario
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 29-10-2007, 14:54   #13
cionci
Senior Member
 
L'Avatar di cionci
 
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.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 29-10-2007, 14:56   #14
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
Quote:
Originariamente inviato da cionci Guarda i messaggi
E' chiaro che se le sorgenti sono parallele e non producono un timestamp non sarà possibile riordinare esattamente gli eventi
il problema era proprio quello
beh, grazie della conferma dei miei sospetti. cercherò il miglior compromesso

grazie mille a tutti per i vostri interventi
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 29-10-2007, 14:58   #15
cionci
Senior Member
 
L'Avatar di cionci
 
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ì'...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 29-10-2007, 14:58   #16
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
Quote:
Originariamente inviato da cionci Guarda i messaggi
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.
chiaro. il fatto è che non mi interessa tanto gestire parallelamente la risposta agli eventi, quanto leggere parallelamente più sorgenti di segnale

comunque grazie infinite per l'aiuto
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 29-10-2007, 15:01   #17
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
Quote:
Originariamente inviato da cionci Guarda i messaggi
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ì'...
eh lo so che con un bel driver e gli irq sarei a posto, ma sono sotto winXP, non ho mai sviluppato software non cross-platform (eccezion fatta per un software multithreaded in C per linux) e non "managed" e inoltre ho tempi di consegna molto stretti... quindi direi che di scrivere un driver per win32 non se parla proprio... pazienza, sarebbe stata la soluzione ottimale

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 15:05.
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 29-10-2007, 15:02   #18
cionci
Senior Member
 
L'Avatar di cionci
 
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 ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 29-10-2007, 15:10   #19
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
Quote:
Originariamente inviato da cionci Guarda i messaggi
Ma sono dei sensori ? Come sono collegati alla macchina ?
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
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 29-10-2007, 15:12   #20
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
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...
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Peugeot Polygon Concept: ecco il futuro delle utilitarie Peugeot Polygon Concept: ecco il futuro delle ut...
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto Kindle Scribe Colorsoft: riduce le cornici e div...
L'IA cambia tutte le regole della sicurezza tra vulnerabilità e sorveglianza. Intervista al CEO di Proofpoint L'IA cambia tutte le regole della sicurezza tra ...
Apple potrebbe aver sospeso il progetto ...
Nintendo non seguirà l'esempio di...
Motorola ha lanciato un'app dedicata all...
Cyberpunk 2077 non si ferma e raggiunge ...
Samsung alza ancora i prezzi delle memor...
4 sconti tutti nuovi riscrivono la TOP 1...
Portatile HP con Intel Core Ultra 7 155H...
Smart TV Haier 50'' 4K crolla a 225,99€ ...
Google Pixel 10a a 399€ o 497€ (256GB) c...
Compare dal nulla e blocca lo schermo: c...
Tornano i super prezzi Nikon su Amazon, ...
Compatto, leggerissimo (1,2Kg), ma con 3...
Privacy Display per tutti i Galaxy S: Sa...
Le migliori cuffie in offerta su Amazon ...
SpaceX Starship: Ship 40 ha eseguito un ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 00:36.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v