在我的应用程序中,多个线程修改相同的数据。虽然在“正常”情况下总是会有消息,但我发现,在messages
运行之前,如果有大量数据,其他线程可能会更快并被删除loopAction
。
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()等。我最好解决这个问题?
答案 0 :(得分:3)
这应该修复类型错误:
return $ case Map.lookup key mT of
Nothing -> return ()
Just messages -> sendq s (B.pack $ unwords messages) "192.168.35.84" 4711
这样两个分支都会生成IO ()
,从而导致STM (IO ())
整体。
但我不确定在价值方面发生了什么。 mT
肯定不能被不同的线程修改......