Domanda

Nella domanda che sto scrivendo, ho bisogno di scrivere un sacco di tipi di base, che molto probabilmente sarà immutabile. Ma mi chiedo come mutabile tipi confronta in applicazioni parallele a quelle immutabili.

È possibile utilizzare i blocchi con oggetti mutabili, giusto? Come ci si confronta con altre tecniche utilizzate con i tipi immutabili nelle applicazioni parallele?

Sei almeno lontano da usare serrature con i tipi immutabili, giusto?

È stato utile?

Soluzione

Tipi

  • Utilizzare i tipi immutabili, per quanto possibile.
  • Utilizzare collezioni thread-safe, invece di serrature esplicite per quanto possibile.
  • Utilizzare esclusivamente tipi mutabili quando non si ha altra scelta ragionevole.

Le discussioni

  • pool di thread Usa il più possibile.
  • Usa loop infiniti quando pool di thread non sono possibili.
  • manualmente avviare e interrompere le discussioni come ultima risorsa.

Se si ha a utilizzare i blocchi espliciti, documentarli accuratamente. Soprattutto quando si tratta di l'ordine in cui si blocca gli oggetti. Se si sa che gli oggetti Foo sono sempre bloccate prima che gli oggetti bar e che Foo (tasto 100) è sempre chiusa prima di Foo (key = 200), non sarà possibile ottenere deadlock.

Altri suggerimenti

La chiave per la scrittura di applicazioni parallelizzabili è di stare lontano da stato condiviso mutevole. Condividendo stato mutabile tra thread richiede la sincronizzazione che comporta tipicamente una qualche forma di bloccaggio. Utilizzando i tipi immutabili può aiutare a garantire che non si è accidentalmente condivisione dello stato, rendendo impossibile per modificare lo stato di tali oggetti. Tuttavia, questa non è una bacchetta magica, ma semplicemente una scelta di design. Se l'algoritmo si sta tentando di parallelizzare richiede stato condiviso, si sta andando ad avere per creare una sorta di sincronizzazione.

Mutabilità non influisce il blocco.

Quando si utilizzano tipi mutabili si sta esporsi a Write-Dopo-Read o Write-Dopo-Scrivi errori. Questi sono errori di sincronizzazione associati con l'aggiornamento di un valore, mentre altri thread sono contemporaneamente leggendo o aggiornare il valore.

Per evitare errori di sincronizzazione è necessario utilizzare una qualche forma di meccanismo di bloccaggio. Se si utilizza blocco esplicito è necessario essere molto attenti circa l'ordine di acquisizione di serrature. Se non si sta attenti si può introdurre i deadlock. Per esempio: infilare un acquisisce blocco X, quindi thread B acquisisce Blocco Y. Un po 'più tardi infilare un richieste di blocco Y e le richieste di discussione B X. Blocco Questo fa sì che entrambi i fili di aspettare a tempo indeterminato per serrature che non verranno mai rilasciati

.

Due buone regole di pollice per il blocco:

  • Acquisire serrature in un ordine specifico (ad esempio sempre acquisire Blocco X prima Blocco Y)
  • serrature Mantenere la posizione per il più breve tempo possibile. Acquisire loro quando ne hai bisogno, e rilasciarli non appena hai finito con il.

Se non scrivete a un oggetto dopo la sua creazione, non è necessario per bloccarlo prima di accedervi. Quindi, non sarà necessario bloccare oggetti immutabili.

Utilizzare i tipi immutabili quando si può. Utilizzare i tipi mutabili quando si deve (serializzazione, ecc.).

Usa System.Threading.Tasks per tutta la parallelizzazione -. Compiti sarà anche essere costruiti con il linguaggio in C # 5 quando asincrona e attendono sono aggiunte le parole chiave

ho scritto un articolo sui tipi mutabili / immutabili in C #: http://rickyhelgesson.wordpress.com/2012/07/17/mutable-or-immutable-in-a-parallel-world/

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