Problema con semafori

mercoledì 28 dicembre 2011 - 09.43
Tag Elenco Tags  C#  |  .NET 4.0  |  Windows 7  |  Visual Studio 2010

Jacky87 Profilo | Newbie

Ciao a tutti, e grazie in anticipo per le risposte.

Ho un'applicazione che si occupa di supervisione, dove ho diversi thread che contemporaneamente eseguono delle richieste di lettura su una porta seriale. Le richieste devono avvenire una per volta, ho sincronizzato i "lettori" con un semaforo:

Semaphore sLettori= new Semaphore(1,1);

Ogni volta che un thread lettore viene schedulato, e accede alla porta modifico il semaforo:

sLettori.WaitOne(); //--- eseguo operazioni di lettura sLettori.Release();

E fin qui tutto ok nessun problema.

Tramite una semplice giu, l'utente può eseguire delle operazioni di scrittura sulla stessa porta seriale. Ora queste operazioni devono avere la precedenza su quelle di lettura, o meglio ogni volta che si sta per eseguire una lettura, devo prima controllare che non ci sia una scrittura in atto, se c'e, aspetto che essa sia finita e poi eseguo la lettura.
Con un solo semaforo come nella mia soluzione, può funzionare, ma non sono riuscito a dare la precedenza alla scrittura, se quando (esempio) premo un tasto per scrivere, se ci sono dei thread "lettori" già in coda, vengono prima eseguiti quest'ultimi e poi la scrittura.

Ho provato ad implemterare questo problema tramite semafori ma non ci sono riuscito. Sono un po' arrugginito in materia, e visto che è una cosa urgente ho pensato di chiedere aiuto qui sul forum.

Spero di essermi spiegato.

luigidibiasi Profilo | Guru

scusami,

non ho capito bene una cosa... tu vuoi che le letture debbano avere la precedenza sulle scritture (prima devono terminare tutte le letture e dopo avvenire la scrittura) o viceversa?

Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

Jacky87 Profilo | Newbie

Ciao, intanto grazie per la risposta, cerco di spiegarmi meglio.

Inanzitutto le scritture devono avere precedenza sulle letture.

Periodicamente devo fare 10 letture di seguito, non importa l'ordine, basta che vengano eseguite una per volta.

Ovviamente non posso interrompere una lettura già iniziata.

Uno scenario potrebbe essere 10 thread che ogni 5 secondi provano a eseguire una lettura.

Quando l'utente esegue una richiesta di scrittura (click su pulsante), ho due casi:

Primo caso: nessun thread sta leggendo. Quindi blocco le letture, eseguo scrittura, abilito le letture

Secondo caso: un thread sta eseguendo una lettura. Aspetto che il thread finisca, blocco le letture, eseguo scrittura, abilito letture.

Spero di essere stato chiaro, sto avendo difficoltà nel bloccare le letture quando eseguo una scrittura.

luigidibiasi Profilo | Guru

credo tu debba usare una coda fifo coi lock allora non solo i semafori...

mi è venuto in mente e sono andato a controllare su un testo ed ho trovato un algoritmo di cui ti riporto la descrizione in inglese:

"Even though the SimpleReadWriteLock algorithm is correct, it is still not quite
satisfactory. If readers aremuch more frequent than writers, as is usually the case,
then writers could be locked out for a long time by a continual stream of readers.
The FifoReadWriteLock class, shown in Figs. 8.10–8.12, shows one way to give
writers priority. This class ensures that once a writer calls the write lock’s lock()
method, then no more readers will be able to acquire the read lock until the writer
has acquired and released the write lock. Eventually, the readers holding the read
lock will drain out without letting any more readers in, and the writer will acquire
the write lock."

chiaramente credo sia possibile scambiare i ruoli di reader e writer ...

per come è definito una volta che il writer ha acquisito il lock tutti si fermano ed aspettano che lui finisca l'operazione e solo dopo possono avvenire le letture... poi vabbe soddisfa la mutua esclusione quindi dovrebbe andar bene?

fammi sapere se la descrizione ti convince te lo mando in privato non so se riesco ad allegarlo qua
Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

Jacky87 Profilo | Newbie

Si, dalla descrizione sembra proprio quello che mi serve

luigidibiasi Profilo | Guru

>> update
scusami non va bene quello che ho postato lo aggiorno a breve
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5