Domanda

Hy,

come tutti sappiamo, lo sviluppo di un'applicazione multithreading è una cosa difficile. Soprattutto il punto in cui e cosa bloccare non è così ovvio. Spesso sto guardando un metodo / classe e devo chiedermi, se condivido alcuni dati, che possono essere modificati da più thread. E quando non sono sicuro che finisca in un lock () su un intero blocco di codice.

Quindi cosa mi piace sapere: hai suggerimenti per schemi / regole, ecc. per identificare i dati condivisi? O tecniche per garantire che il tuo codice sia thread-safe.

per esempio:.

  • I metodi statici non devono modificare i campi di classe. (A meno che non blocchino il campo.)
  • I parametri del tipo di riferimento di un metodo non devono essere passati "direttamente". Passa sempre un clone.

A proposito:

Microsoft Research sta lavorando su CHESS . Uno strumento per trovare e riprodurre Heisenbugs in programmi simultanei. Spero che questo e PLINQ migliorino lo sviluppo di programmi concorrenti.

È stato utile?

Soluzione

Ove possibile, rendi i tuoi tipi immutabili per cominciare. Quindi non è necessario clonare. Se devi " cambiare " il contenuto di un oggetto, fai in modo che il metodo restituisca un nuovo oggetto, proprio come String.Replace ecc.

Questo è fondamentalmente lo stile di programmazione funzionale ed è adorabile. È un peccato che non abbiamo (attualmente) raccolte immutabili integrate nel framework .NET, sebbene ce ne siano di terze parti in giro, incluso uno dal nostro JaredPar .

Altri suggerimenti

L'incapsulamento dei dati in una classe è utile per renderlo thread-safe. Puoi avere il controllo su come accedere ai dati e puoi rendere la classe responsabile della sincronizzazione invece di avere il codice in tutta l'applicazione cercando di sincronizzare correttamente.

Inoltre, hai un posto dove mettere una variabile privata che puoi usare come identificatore di blocco, in modo da poter evitare di usare i dati stessi come identificatore per il blocco. Avendo una variabile privata dedicata come identificativo di blocco rimuovi una possibile fonte di deadlock.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top