Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,537

    [c#] Accesso risorse e sincronizzazione

    ciao a tutti, spero abbiate passato un buon ferragosto.

    Ho un quesito da porvi a livello concettuale :

    supponiamo di avere un'applicazione che controlla piu' porte com e che i dati da trasmettere siano uguali in tutte le porte controllate; quindi è possibile intercambiarle a secondo del carico su ognuna di esse; mi spiego meglio :

    immaginate che in queste porte ci siano dei pc che dialogano con il programma, quest'ultimo inizia a dialogare su una porta e attende risposta, e cosi' fino a che termina l'iterazione.
    come gia detto le porte sono "intercambiabili" l'importante è che una volta iniziato un dialogo questo si concluda senza interferenze da altri thread e nella stessa porta ovviamente!.
    a questo punto sincronizzare i thread sarebbe semplice, ma il punto è come si fa a fare in modo che se un thread impostato per una porta a priori trovi questa "impegnata" si sposti su un altra libera e nel caso non ne trovi una attenda la prima che si libera?

    ovviamente non è possibile sapere a priori (immaginiamo si tratti di una libreria) quante porte verranno rese disponibili.

    attendo fiducioso voi guru!

  2. #2
    Potresti creare una lista (direi un ArrayList o qualche altra struttura del genere) che contiene un'istanza per porta di una classe che rappresenta una porta da gestire; ogni thread andrà a controllare questa lista per vedere quali sono occupate e quali sono libere, e seguirà i criteri che hai indicato per decidere cosa fare. Ovviamente quando un thread deciderà di usare una porta andrà a modificare lo stato dell'oggetto-porta in modo che gli altri thread sappiano che è in uso, e farà l'operazione inversa quando avrà finito di utilizzarla. Probabilmente dovrai prendere qualche precauzione nello scrivere questa classe per evitare di incorrere in problemi derivanti dall'uso da più thread.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,537
    ciao MItaly,

    il problema sta nella sincronizzazione, diciamo che se uso lock per controllare la var mi tiene bloccato lo stesso tanto che controllare direttamente la porta e quindi di metterla in coda, mi spiego meglio :

    supponiamo che io abbia una classe che si occupa di avere una lista di porte e un metodo che esegue un'altra classe che incapsula tutta la logica di comunicazione, quest'ultima viene eseguita in altro thread che ha il suo ciclo di vita ed è indipendente, quando ha terminato genera un evento.
    ora se io uso una qualsiasi risorsa (in questo caso come dici tu una lista di porte e ne controllo la prop. IsOpen oppure aggiungo dei bool per porta ecc..) devo "lockkarla" se no addio coerenza... pero' comunque non ho la certezza assoluta che dal momento che controllo e ottengo il via libera al momento che impegno la porta un altro thread non abbia fatto prima e se lockko tutta la classe, la blocco anche per i thread che devono attendere che io finisca di lavorare (ho leggere) la mia lista di porte perchè a quel punto prima di morire il thread deve utilizzare la lista per liberare, quindi se la lista e lock anche i tread lo diventano.

    se sincronizzo i thread ottengo una coda coerente ma non so come smistare ed incanalare su diverse code.

  4. #4
    Non puoi inserire una critical section (ossia un blocco lock) dal controllo "Porta.IsOpen" all'apertura vera e propria della porta?
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,537
    Originariamente inviato da MItaly
    Non puoi inserire una critical section dal controllo "Porta.IsOpen" all'apertura vera e propria della porta?
    scusa l'ignoranza, ma che cos'è una critical section ? visto cosi' sembra l'equivalente del lock in c# pero' non so

  6. #6
    Esatto, in C# le critical sections sono implementate tramite i blocchi lock.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,537
    ah ok...

    il problema è che se lo uso sulla lista mi ritrovo una coda incoerente perchè nell'arco di tempo dopo che faccio il controllo lo devo sbloccare e la velocità dei thread non è calcolabile, se blocco tutto il blocco allora blocco anche l'esecuzione dei thread per il tanto che faccio il controllo e quindi rimando anche la liberazione delle porte. a quel punto meglio una coda coerente che inizia e finisce il suo lavoro e accodare un po qui e un po la a priori.

    senza sincronizzare il problema e che non sempre la seriale risponde subito, e quindi mi ritrovo comunque ad avere tutti i thread bloccati e una accesso alla porta che si puo' anche accavallare con la richiesta successiva o precedente mandando in frantumi la logica della classe incapsulata.

    invece sincronizzando ottengo che comunque tutto il codice della "capsula" viene eseguito dall'inizio alla fine, anche se non nell'ordine di arrivo, ma questo non ha importanza perchè tutta la logica viene seguita dentro la "capsula" e le risposte sono ad eventi, quindi otterrò la mia logica quando ha terminato e non mentre viene eseguita.

    non so se sono stato chiaro... sono un casino con le spiegazioni io :rollo:

  8. #8
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,537
    avrei pensato anche una soluzione del tipo :

    attribuisco un valore alla "capsula" che determina la "lunghezza" dell'operazione (attribuita gia dentro la classe in progettazione) e faccio un conteggio dei thread accodati nella porta, una cosa tipo per ogni thread moltiplico il valore della "capsula" e aggiungo ad un contatore x porta, durante la fase di avvio della capsula determino il valore minore della coda e lo inserisco in quella, ovviamente quando la cpsula ha terminato decremento, tutto senza lock, tanto potrei farlo anche "indicativo"...
    pero' avrei preferito qualcosa che mi calcolasse con piu' precisione


    in ogni caso non ho ancora ringraziato MItaly per l'interessamento, e per eventuali ulteriori suggerimenti, lo faccio ora: grazie MItaly.

    e comunque grazie a tutti quelli che si vorranno interessare al caso

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.