2010-01-21 24 views
6

Esistono implementazioni disponibili di un Hashtable che forniscono sicurezza del thread con un blocco minimo in .NET? O in un'altra lingua che può essere portato su .NET?Minimo thread-safe hashtable?

Stiamo cercando qualcosa in mezzo usando un dizionario BCL <,> classe con lock() e un'applicazione di caching distribuita come memcached o Velocity.

L'uso previsto è per una cache con migliaia di lettori che leggono valori immutabili basati su chiavi (numeri o guids, non abbiamo ancora deciso quale). Ci saranno molti meno scrittori, forse solo uno.

+0

Si prega di definire cosa si intende per "thread-safe". cf. http://blogs.msdn.com/ericlippert/archive/2009/10/19/what-is-this-thing-you-call-thread-safe.aspx – jason

+0

Potrebbe anche essere utile descrivere lo scenario di utilizzo. Stai per mixare insert/lookup/remove o saranno raggruppati in qualche modo? Tutte le operazioni saranno accessibili da molti thread o solo da alcuni? – Dolphin

risposta

4

A partire da .Net 4.0 c'è ConcurrentDictionary. Questa è una struttura di stile hashtable pensata per un utilizzo ad alte prestazioni tra più thread.

Dettagli su di essa l'uso e l'attuazione può essere trovato qui:

+0

Questo non sembra essere indicizzabile con una chiave; Ad esempio, non esiste un modo 'O (1)' per ottenere un valore chiave specifico. 'ConcurrentBag' sembra più utile per gli scenari produttore/consumatore. Forse intendevi "ConcurrentDictionary ' (http://msdn.microsoft.com/en-us/library/dd287191(VS.100).aspx)? – jason

+0

Sicuramente vuoi dire ConcurrentDictionary? http://msdn.microsoft.com/en-us/library/dd287191(VS.100).aspx –

+0

@Jason, @Michael, grazie, sì, intendevo ConcurrentDictionary. La mia migliore scusa è che è presto e sono su SO prima di bere il caffè. – JaredPar

1

In What's the best way of implementing a thread-safe Dictionary? Brian Rudolf condivide un link a un dizionario thread-safe che utilizza ReaderWriterLockSlim: http://devplanet.com/blogs/brianr/archive/2008/09/26/thread-safe-dictionary-in-net.aspx.

È anche possibile visualizzare la Hashtable sincronizzata: http://msdn.microsoft.com/en-us/library/system.collections.hashtable.aspx.

+0

Il dizionario basato su ReaderWriterLockSlim sembra esattamente quello che stavo chiedendo: un blocco più efficiente. Link diretto: http://devplanet.com/blogs/brianr/archive/2008/09/26/thread-safe-dictionary-in-net.aspx Hashtable sincronizzato è esattamente quello che stavo cercando di evitare, semplice lock() su tutti gli accessi. –

+0

Lo userete o aspettate il .Net 4 ConcurrentDictionary? –