Podpis modifyIORef
jest dosyć prosta:Jaki jest cel dodatkowego parametru wyniku atomicModifyIORef?
modifyIORef :: IORef a -> (a -> a) -> IO()
Niestety, to nie jest bezpieczeństwo wątków. Istnieje alternatywa, która rozwiązuje ten problem:
atomicModifyIORef :: IORef a -> (a -> (a,b)) -> IO b
Czym dokładnie różnią się te dwie funkcje? Jak mam używać parametru b
podczas modyfikowania IORef
, który może być odczytany z innego wątku?
tak, gdyby został 'atomicModifyIORef :: IORef a -> (a -> a) -> IO A', wracając starą wartość, by służył ten sam cel (i być prostszy, IMO). Ciekawy. – chi
Czego nie rozumiem, dlaczego potrzebuję tej funkcji dla 'atomicModifyIORef', ale nie dla' modifyIORef'? – leftaroundabout
@leftaroundabout No cóż, 'modifyIORef' nie zapewnia żadnych gwarancji atomowości, więc nie byłoby to zbyt użyteczne. – redneb