gpt4 book ai didi

haskell - STM单子(monad)问题

转载 作者:行者123 更新时间:2023-12-03 23:33:11 25 4
gpt4 key购买 nike

这只是一个假设的场景来说明我的问题。假设它们之间共享两个线程和一个 TVar。在一个线程中有一个原子 block 读取 TVar 并需要 10 秒才能完成。在另一个线程中是一个原子 block ,它每秒修改一次 TVar。第一个原子 block 会完成吗?当然它会一直回到开头,因为日志永远处于不一致的状态?

最佳答案

正如其他人所说:理论上没有进步的保证。在实践中,也不能保证进步:

import Control.Monad -- not needed, but cleans some things up
import Control.Monad.STM
import Control.Concurrent.STM
import Control.Concurrent
import GHC.Conc
import System.IO

main = do
tv <- newTVarIO 0
forkIO (f tv)
g tv

f :: TVar Int -> IO ()
f tv = forever $ do
atomically $ do
n <- readTVar tv
writeTVar tv (n + 1)
unsafeIOToSTM (threadDelay 100000)
putStr "."
hFlush stdout

g :: TVar Int -> IO ()
g tv = forever $ do
atomically $ do
n <- readTVar tv
writeTVar tv (n + 1)
unsafeIOToSTM (threadDelay 1000000)
putStrLn "Done with long STM"

在我的测试中,上面从未说过“用长 STM 完成”。

显然,如果您认为计算仍然有效/相关,那么您可能想要
  • 离开原子 block ,执行昂贵的计算,进入原子 block /确认假设有效/并更新值。潜在危险,但不比大多数锁定策略更危险。
  • 在原子 block 中内存结果,因此仍然有效的结果将只不过是重试后的廉价查找。
  • 关于haskell - STM单子(monad)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3031878/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com