Я застрял в понимании концепции атомарности в STM.
поясняю на примере
import Control.Concurrent
import Control.Concurrent.STM
import Control.Monad
import qualified Data.Map as Map
main :: IO ()
main = do
d <- atomically$ newTVar Map.empty
sockHandler d
sockHandler :: TVar (Map.Map String Int)-> IO ()
sockHandler d = do
forkIO $ commandProcessor d 1
forkIO $ commandProcessor d 2
forkIO $ commandProcessor d 3
forkIO $ commandProcessor d 4
forkIO (threadDelay 1000 >> putStrLn "Hello World?")
threadDelay 10000
return ()
commandProcessor :: TVar (Map.Map String Int)-> Int-> IO ()
commandProcessor d i= do
addCommand d i
commandProcessor d i
addCommand :: TVar (Map.Map String Int) ->Int -> IO ()
addCommand d i = do
succ <- atomically $ runAdd d
putStrLn $"Result of add in " ++ (show i)++ " " ++( show succ)
runAdd d =do
dl <- readTVar d
let (succ,g)= if Map.member "a" dl
then
(False,dl)
else
(True,Map.insert "a" 9 dl)
writeTVar d g
return succ
Пример вывода будет таким:
Результат добавления в 1 True Результат добавления в 4 False Результат добавления в 1 FalseРезультат добавления в 2 FalseРезультат добавления в 3 False Hello World? Результат добавления в 4 False
Результат добавления в 1 FalseРезультат добавления в 2 False Результат добавления в 3 False Результат добавления в 4 False
Результат добавления в 1 False Результат добавления в 2 FalseРезультат добавления в 3 FalseРезультат добавления в 4 False
Результат добавления в 1 False Результат добавления в 2 FalseРезультат добавления в 3 FalseРезультат добавления в 4 False
Результат добавления в 1 False Результат добавления в 2 FalseРезультат добавления в 4 FalseРезультат добавления в 3 False
Результат добавления в 1 False Результат добавления в 4 FalseРезультат добавления в 2 FalseРезультат добавления в 3 False
Результат добавления в 1 FalseРезультат добавления в 4 False Результат добавления в 2 False Результат добавления в 3 False
Результат добавления в 1 FalseРезультат добавления в 4 False
Результат добавления в 2 FalseРезультат добавления в 3 False
Результат добавления в 1 FalseРезультат добавления в 4 False
Результат добавления в 2 FalseРезультат добавления в 3 False Результат добавления в 1 False Результат добавления в 4 False
Результат добавления в 2 FalseРезультат добавления в 3 False
Результат добавления в 1 FalseРезультат добавления в 4 False
Когда я прочитал об атомном
. Это означает, что все операции внутри транзакции полностью завершены, без каких-либо других потоков, изменяющих переменные, которые использует наша транзакция, или она терпит неудачу, и состояние откатывается к тому состоянию, в котором оно было до начала транзакции. Короче говоря, атомарные транзакции либо завершаются полностью, либо как будто они вообще никогда не выполнялись.
Итак, на вопрос, может ли «возврат» успеха в некоторых случаях никогда не произойти? Это может быть строка succ ‹- атомарно $ runAdd d putStrLn $"Результат добавления в " ++ (показать i)++ " " ++(показать succ)
дать вывод «Результат добавления в ?i» («как будто они вообще никогда не запускались»)