La documentazione di ConcurrentDictionary
fa stato non esplicito, quindi credo che non possiamo aspettarci che i delegati valueFactory
e updateValueFactory
hanno la loro esecuzione sincronizzata (da GetOrAdd() e AddOrUpdate() le operazioni rispettivamente).Pitfall ConcurrentDictionary - Le fabbriche dei delegati da GetOrAdd e AddOrUpdate sono sincronizzate?
Quindi, penso che non possiamo implementare l'uso delle risorse al loro interno che necessitano di controllo parallelo senza implementare manualmente il nostro controllo concomitante, forse solo utilizzando [MethodImpl(MethodImplOptions.Synchronized)]
sopra i delegati.
Ho ragione? O il fatto che ConcurrentDictionary
sia thread-safe possiamo aspettarci che le chiamate a questi delegati siano automaticamente sincronizzate (thread-safe)?
Così sto avvolgendo la chiamata del metodo GetOrAdd in un blocco ma questo rende inutile lo scopo del ConcurrentDictionary. C'è un modo migliore? – John
Sono un po 'confuso da questo, stiamo sostanzialmente dicendo che se un delegato viene passato come chiave, che la sua esecuzione non sarà sincronizzata nella valutazione del * valore *? Oppure se abbiamo un dizionario con tipo "delegato" come valore ... che quando proviamo ad eseguire il delegato (cioè il dizionario [chiave] (argomento); ') che l'esecuzione non sarà sincronizzata? O, mi manca completamente il punto? Grazie. – Snoopy
@Snoopy: il delegato che valuta il valore da aggiungere non è sincronizzato. Ciò significa che se il tuo delegato fa qualcosa che non è thread-safe * e * non hai fatto un tentativo di sincronizzare quell'operazione da solo, allora accadranno cose brutte. Ma, la cosa che un delegato che funge da fabbrica per un valore normalmente non sta facendo cose che non sono thread-safe per natura. Il più delle volte il delegato sta probabilmente facendo 'new SomeObject()' che è sicuramente thread-safe perché è un'operazione senza stato. –