Domanda

Sto raccogliendo C # 4.0 e una delle cose che mi è confusa, è il concetto di barriera.

Non è questo, proprio come con il WaitAll metodo WaitHandle? Non che aspettare per tutte le discussioni a finire?

Ho imparato la barriera costruire da questa pagina: http://www.managed-world.com/archive/2009/02/09/an-intro-to-barrier.aspx

Tuttavia, sembra proprio come il metodo WaitAll. Che cosa mi manca? Qual è la differenza qui?

Grazie.

È stato utile?

Soluzione

Sembra che tu sei curioso di sapere perché una barriera dovrebbe essere preferito un derivato WaitHandle + WaitForAll? Entrambi possono raggiungere un obiettivo simile, se strutturato in modo corretto.

Non sono estremamente familiarità con barriera, ma un vantaggio che salta fuori di me è un problema di risorse. Per sincronizzare N fili con una barriera richiede solo una singola istanza barriera. Per sincronizzare N fili tramite un WaitHandle e WaitAll richiede N maniglie. Queste risorse sono a buon mercato, ma non è gratuito. Ridurre il numero di risorse per sincronizzare un gruppo di fili ha i suoi vantaggi.

Altri suggerimenti

Barriera . Si attende per un gruppo di più thread per raggiungere certo punto, invece di uno. E 'spesso usato nel calcolo scientifico e la simulazione per rappresentare il tempo "zecche".

Immaginate una griglia di 1000 x 1000 x 1000 di cubi che rappresentano miglio cubo di aria. Al tempo zero un dato cubo unitario viene influenzato da vari parametri dei suoi vicini, come temperatura e pressione. Una volta che tutti calcola il tempo 1, fate lo stesso per il tempo 2 ... È possibile ottenere una simulazione del clima. storia simile per la simulazione nucleare.

C'è anche una variazione della barriera chiamato CyclicBarrier se accetta le discussioni che non ha tolto dalla linea di partenza e farlo entrare di nuovo nel gruppo dopo un certo tempo. Non è chiaro dalla documentazione se C # 4 di barriera è una barriera ciclica, ma c'è una proprietà chiamata ParticipantsRemaining .

Barrier offre un più alto livello di astrazione e la convenienza: una sola chiamata SignalAndWait è tutto ogni thread ha bisogno di fare, piuttosto che dover sapere quale gestire nella matrice esso dovrebbe segnalare (o utilizzare un mutex per trovare e incrementare il "prossimo disponibili posto nella matrice" e il segnale che) e dover primo segnale e poi WaitAll.

Alla fine del corso è possibile eseguire la stessa operazione di sincronizzazione con l'uso appropriato di altri meccanismi di sincronizzazione, ma per un tale modello di utilizzo comune come incarna Barrier, è comodo avere una soluzione così conveniente e infallibile già lì e ordinatamente confezionato su; -).

WaitFor è un'istruzione Transact SQL. Esso blocca l'esecuzione di un batch, stored procedure o transazioni fino ad un tempo specificato o intervallo di tempo viene raggiunto, o una specifica modifica dichiarazione o restituisce almeno una riga.

Una barriera è una primitiva di sincronizzazione che impone alla sospensione della esecuzione tra un numero di fili o processi in un determinato punto e impedisce ulteriore esecuzione finché tutti i thread o trasformatori hanno raggiunto il punto indicato.

Se lei si riferisce a WaitAll, WaitAll richiede di mantenere una serie di WaitHandles. In questo senso, la barriera è un po 'più semplice da utilizzare. Tuttavia, sono d'accordo i due metodi guardano notevolmente simili.

La funzione principale debolezza WaitAll è un massimo maniglie limite (solo 64 maniglie possono essere utilizzati) Soluzione per il limite maniglia WaitHandle.WaitAll 64?

Sembra un WaitHandle contato per me. Ti dà la comodità di dire "quando il numero di thread in attesa di questo blocco diventa X, lasciarli andare tutti." Non è niente non si può fare con un altro costrutto, ma sembra conveniente.

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