在我的應用程序中,有幾個線程修改相同的數據。在「正常」情況下,總是會有一條消息,我發現如果數據量很大,可能會發生其他線程更快並且在loopAction
運行之前被刪除messages
。一個動作中的不可辯駁的模式?
transMit :: Socket -> POSIXTime -> String -> TPSQ -> TMap -> IO()
transMit s time newmsgs q m = do
loopAction <- atomically $ do
mT <- readTVar m
qT <- readTVar q
let mT' = Map.delete key mT
let qT' = PSQ.delete key qT
writeTVar q (PSQ.insert key time qT')
writeTVar m (Map.insert key [newmsgs] mT')
return (let Just messages = Map.lookup key mT in sendq s (B.pack $ unwords messages) "192.168.35.84" 4711)
loopAction
我想在這裏的情況下,表達式,如
case (Map.lookup key MT) of
Nothing -> return()
_ -> something w IO
,但它並沒有當然的,因爲一個回報的工作()和其他分支返回IO(),等。什麼是我的最好採取解決這個問題?
順便說一句,'do {m < - mm; m}≡join mm',所以你可以寫'join。原子地$ do ...'。 – Vitus 2012-03-18 12:58:15