Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    12

    [c#] Sincronizzazione Thread (se va bene può essere una pillola)

    Premetto che programmo da poco in c# e provengo da php, quindi perdonatemi se sparo c***ate.
    Ho realizzato un Applicazione multithread.
    Ogni thread fa letture e scritture sia per l'oggetto dove si trova il metodo del thread,
    sia su 2 oggetti singleton.
    Ho pensato di utilizzare il modificatore private per tutte le proprietà condivise dai vari thread e sfruttare i getter e setter con all'interno i lock in modo da ottenere un'applicazione thread-safe, senza preoccuparse di monitorare oggetti in ogni parte del codice pasticciando il tutto.

    Codice PHP:
    public int Var
            {
                
    get
                
    {
                    
    int a;
                    
    lock (this) {
                        
    = var;
                    }
                    return 
    a;
                }
                
    set
                
    {
                    
    lock (this)
                    {
                       var = 
    value;
                    }
                }
            } 
    Che ne pensate?è una buona soluzione?

  2. #2
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,538
    ciao,

    premetto che non ho tantissima esperienza con il multithreading, pero' credo che se fai cosi blocchi tutta la classe (hai inserito il lock su this) mentre se a te interessa che venga bloccata solo la proprietà dovresti (cosi' ho visto in un esempio su msdn) usare un campo di tipo oggetto e bloccare quello :

    codice:
    public class classe
    {
    
          object lockThis = new object();
    
    public int Var 
            { 
                get 
                { 
                    int a; 
                    lock (lockThis) { 
                        a = var; 
                    } 
                    return a; 
                } 
                set 
                { 
                    lock (lockThis) 
                    { 
                       var = value; 
                    } 
                } 
            }
    
    }
    se non ho capito male facendo cosi dovresti riuscire a tenere la classe "libera" anche quando si richiede la lettura o modifica della proprietà, ma allo stesso tempo, visto che quando viene utilizzata la proprietà viene bloccato un oggetto (lockThis) questo non puo' essere impegnato da altre parti facendo in modo che venga accodata la richiesta sulla proprietà e non tutta la classe.

    comunque ho ancora un po di incertezza a riguardo, quindi ti consiglio di approfondire il discorso su msdn o con google.

    guarda qui forse potrebbe interessarti.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    12
    object lockThis = new object();
    Il lock non mi permette di bloccare qualsiasi oggetto, quando cerco di blocare gli int e le stringhe mi genera un errore, facendo il cast l'errore sparisce.
    lock((object) varInt){}
    è un pò strano come comportamento visto che tutti i tipi compreso gli int e le stringhe derivano dalla classe object.

    Cmq ho pensato di creare una classe con tutte le proprietà e i metodi condivisi tra i thread e fare il lock dell'oggetto creato da tale classe!

  4. #4
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,538
    Originariamente inviato da IfElseIf
    object lockThis = new object();
    Il lock non mi permette di bloccare qualsiasi oggetto, quando cerco di blocare gli int e le stringhe mi genera un errore, facendo il cast l'errore sparisce.
    lock((object) varInt){}
    è un pò strano come comportamento visto che tutti i tipi compreso gli int e le stringhe derivano dalla classe object.

    Cmq ho pensato di creare una classe con tutte le proprietà e i metodi condivisi tra i thread e fare il lock dell'oggetto creato da tale classe!
    si permette di bloccare solo riferimenti.

    qui forse dico una cazz..uola :
    credo che se fosse possibile bloccare un valore bloccheresti tutta l'esecuzione di tutte le classi che ne fanno uso per via del fatto che i valori vengono allocati nello stack, mentre i riferimenti nell' heap, fatta eccezione (credo, ma del resto non sono sicuro di nulla! ) per string.

    quindi facendo il casting poni il valore nell'heap ma come object e non come valore vero e proprio.

    la mia vorrebbe essere solo un idea, per avere certezze ti consiglio di attendere la parola dei "grandi" del forum

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.