2010-07-10 11 views

risposta

14

According to Microsoft's documentation, la classe Dizionario può supportare più lettori contemporaneamente, a condizione che la raccolta non venga modificata. Pertanto, non sono richieste serrature.

+2

Non ho idea del motivo per cui più persone non controllano i documenti. È il primo posto in cui tutti dovrebbero guardare. Perché chiedere al mondo quando puoi chiedere ai ragazzi che hanno scritto il codice? :) +1 –

+2

@KierenJohnstone Il motivo è perché le persone generalmente gravitano attorno a ciò che funziona. I dottori mi hanno insegnato a non guardarli, tranne che per tutte le informazioni tranne le più superficiali. Ho * usato * per guardarci prima per questo tipo di risposte. Perché di solito non sono lì, non guardo più lì prima.(Chiedo a Google, Google mi porta qui, sono contento che Google mi abbia portato qui invece dei documenti!) :) – pettys

+0

Tuttavia, qualcuno ha notato il seguente commento nei documenti - dopo aver letto "è sicuro": "Anche così, enumerare attraverso una collezione non è intrinsecamente una procedura thread-safe. "? – dcg

2

No. Il blocco è necessario solo quando si ha la possibilità di intercalare più scritture o scritture con letture. La sola lettura, senza modifiche, non introduce la possibilità di ciò che sta facendo un thread che influenza ciò che sta facendo un altro thread.

Nota che questo non richiede alcuna scrittura. Se, per esempio, stai usando un oggetto e lo leggi in qualche modo modifica lo stato interno dell'oggetto come effetto collaterale, allora dovresti avere il blocco ancora.

+0

Anche se questo è documentato come il caso per uno specifico oggetto dizionario, questo non è vero per gli oggetti dizionario in generale. Immaginate, per esempio, un oggetto dizionario che, una volta letto da esso, riorganizza la sua struttura interna in modo che l'oggetto letto di recente venga spostato in primo piano nell'elenco dei bucket hash, in modo che la volta successiva venga letto, sia più veloce. Molti dizionari scritti per i compilatori hanno questa proprietà perché se si guarda su "WriteLine" all'interno di "Console" una volta, le probabilità sono buone si sta per cercare di nuovo. Ciò significa che le letture possono causare mutazioni che potrebbero non essere thread-safe. –

+0

@Eric - equo e vero. Ho rimosso la parola "custom" dal mio secondo paragrafo perché, come hai sottolineato, molti oggetti framework fanno anche questo. – Donnie

1

Modifica: Sembra che i documenti affermino che questa classe è sicura per la lettura. Ma se la risposta qui sotto non si applica ancora, dato che non puoi supporre che la tua sola lettura sia di sola lettura per la classe.


La risposta breve è sì. A meno che la classe non dica che è thread-safe. Ci sono molte cose che potrebbero fare che non sono thread-safe.

È probabile che non causi problemi, ma la classe potrebbe utilizzare variabili interne in un modo che potrebbe causare condizioni di competizione. Potrebbe anche essere chiamare altre classi che non sono thread-safe. A meno che non verifichi che il codice dei documenti dice che è OK, non è sicuro assumere.

Ad esempio, si potrebbe pensare che sia di sola lettura, ma la classe che tenta di accelerare le cose può memorizzare nella cache l'ultima voce a cui si accede che comporta la scrittura di dati. Questo potrebbe fallire causando il recupero di un oggetto diverso dal previsto.

Anche in questo caso non penso che sia probabile, ma a meno che la classe non dica che il thread è sicuro, è pericoloso presumere.

+0

Significa che se cambio alcune proprietà di un oggetto contenuto nel dizionario posso ottenere un'eccezione? –

+0

È consigliabile eseguire il TEST MOLTO CONTO, ma molte raccolte possono essere lette contemporaneamente in modo sicuro anche se non sono etichettate come "thread safe". Supponendo che sia pericoloso può portare a prestazioni peggiori senza alcun guadagno. – Donnie

+0

@ user375487: Probabilmente non otterrai un'eccezione, ma puoi avere comportamenti strani. È necessario bloccare l'oggetto che si sta modificando poiché è possibile che più thread provino a modificarlo contemporaneamente. – Donnie

Problemi correlati