Qualcuno può spiegare come funziona atomicModifyIORef
? In particolare:Haskell: Come funziona 'atomicModifyIORef'?
(1) Attende un blocco o tenta ottimisticamente di riprovare in caso di contesa (come TVar
).
(2) Perché la firma di atomicModifyIORef
è diversa dalla firma di modifyIORef
? In particolare, qual è questa variabile extra b
?
Edit: credo di aver capito la risposta (2), in quanto b
è un valore da estrarre (questo può essere vuoto se non necessario). In un programma a thread singolo, conoscendo il valore è banale, ma in un programma multithread, si potrebbe voler sapere qual era il valore precedente al momento dell'applicazione della funzione. Suppongo che questo è il motivo per modifyIORef
non ha questo valore di ritorno extra (come tali usi di modifyIORef
con questo valore di ritorno probabilmente dovrebbero usare atomicModifyIORef
comunque. Sono ancora interessato nella risposta alla (1) però.
Esegue il blocco o è ottimista? La versione GHC sembra solo chiamare una primitiva GHC. – Clinton
Si noti che a causa della pigrizia, 'atomicModifyIORef' deve solo cambiare il valore corrente per puntare a un thunk, con il lavoro effettivo che viene ritardato fino a quando non viene letto in un secondo momento. AFAIK, si compila in qualcosa come un CAS sulla maggior parte delle piattaforme. – hammar
Ottimista, tramite un circuito di scambio (cas) interbloccato. https://github.com/ghc/ghc/blob/45740c29b24ea78b885d3b9f737a8bdc00265f7c/rts/PrimOps.cmm#L364 –