Reading Bartosz del fantastico blog post Milewski su STM, ero entusiasta di leggere quanto segue:L'STM fornisce un blocco a grana fine per le strutture dati esistenti?
Ma prendere in considerazione un fatto importante: STM è molto a grana fine. Per l'istanza , quando si inserisce un elemento in un albero, la transazione STM bloccherà solo i nodi che si stanno effettivamente modificando. STM batterà facilmente una soluzione che utilizza un blocco globale per l'intero albero .
Tuttavia, a quanto ho capito, questo comportamento non è automatico, vero? Se utilizzo uno TVar (Map k a)
, non agirà come un unico blocco globale sull'intera mappa? E per ottenere il vantaggio di questo comportamento a grana fine, io (o qualcuno) dovrei implementare una sostituzione di mappa (TMap
, ad esempio) che contenga internamente TVars
, corretto?
Questa potrebbe sembrare una domanda ovvia, ma leggendo su implementazione STM sono stato confuso tra le letture di TVar
se letture di posizioni di memoria. Voglio solo assicurarmi di averlo bene!
Bartosz va oltre a dire:
Per-nodo bloccaggio manuale è difficile da implementare correttamente perché del rischio di deadlock.
La differenza con STM, come mi risulta, è che mentre l'attuazione STM in effetto usa blocca il modo in cui una soluzione manualmente bloccato potrebbe, l'acquiry e rilascio di serrature effettivo è gestita dal runtime, non il programmatore - corretto?
Dipende dall'implementazione ma ci sono molti modi senza blocco per implementare STM (confronto atomico e scambio, per esempio). Per quanto riguarda la prima domanda, sì, avresti bisogno di mappe di 'TVar's e non di' TVar (Map k v) '. –
@ ThomasM.DuBuisson grazie per quello. Vuoi dire che posso effettivamente avere una 'mappa' a grana fine, o dovrei re-implementare completamente' Map' per usare 'TVar's internamente? –
Inoltre, ho appena saputo che "acquiry" è in realtà una parola. Congettura fortunata –