我一直在理解 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 FalseResult 添加 3 False Hello World?添加的结果 4 False
add in 1 的结果 False add in 2 的结果 False add in 3 的结果 False add in 4 的结果 False
add in 1 的结果 False add in 2 的结果 False add in 3 的结果 False add in 4 的结果 False
add in 1 的结果 False add in 2 的结果 False add in 3 的结果 False add in 4 的结果 False
add in 1 的结果 False add in 2 的结果 False add in 4 的结果 False add in 3 的结果 False
add in 1 的结果 False add in 4 的结果 False add in 2 的结果 False add in 3 的结果 False
add in 1 的结果 False add in 4 的结果 False add in 2 的结果 False add in 3 的结果 False
add in 1 False 结果 add in 4 False
add in 2 False 结果 add in 3 False
add in 1 False 结果 add in 4 False
添加结果 2 False 添加结果 3 False 添加结果 1 False 添加结果 4 False
add in 2 False 结果 add in 3 False
add in 1 False 结果 add in 4 False
当我读到原子
. 这意味着事务中的所有操作完全完成,没有任何其他线程修改我们的事务正在使用的变量,否则它会失败,并且状态会回滚到事务开始之前的位置。简而言之,原子事务要么完全完成,要么就好像它们从未运行过一样。
那么对于这个问题,在某些情况下,成功的“回归”可能永远不会发生吗?那可以是 succ <- atomically $ runAdd d putStrLn $"Result of add in " ++ (show i)++ " " ++( show succ)
给出“添加结果?i”的输出(“好像它们根本没有运行”)