【发布时间】:2011-02-02 08:56:52
【问题描述】:
我一直在理解 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 添加结果 in 4 False add in 1 的结果 FalseResult of add in 2 FalseResult of 添加 3 False Hello World?的结果 加4个假
添加结果 1 FalseResult of add in 2 False add in 3 False 的结果 添加结果 4 False
添加结果 1 False 添加结果 in 2 FalseResult of add in 3 False 加 4 的结果 False
添加结果 1 False 添加结果 in 2 FalseResult of add in 3 False 加 4 的结果 False
添加结果 1 False 添加结果 in 2 FalseResult of add in 4 False 加 3 的结果 False
添加结果 1 False 添加结果 in 4 FalseResult of add in 2 False 加 3 的结果 False
添加结果 1 FalseResult of add in 4 False add in 2 False 的结果 加 3 False 的结果
添加结果 1 FalseResult of add 在 4 错误
添加的结果 2 FalseResult of add 在 3 错误
添加结果 1 FalseResult of add 在 4 错误
添加的结果 2 FalseResult of add in 3 False add in 1 False 的结果 添加结果 4 False
添加的结果 2 FalseResult of add 在 3 错误
添加结果 1 FalseResult of add 在 4 假
当我读到关于原子的
。这意味着事务中的所有操作完全完成,没有任何其他线程修改我们的事务正在使用的变量,或者它失败,并且状态回滚到事务开始之前的位置。简而言之,原子事务要么完全完成,要么就好像它们从未运行过一样。
那么对于这个问题,在某些情况下,成功的“回归”可能永远不会发生吗? 那是行 succ
给出“添加结果?i”的输出(“好像它们根本没有运行”)
【问题讨论】:
标签: haskell ghc transactional-memory