Ale*_*lex 13 monads concurrency haskell transactional-memory
这只是一个假设情景来说明我的问题.假设它们之间共享两个线程和一个TVar.在一个线程中有一个原子块来读取TVar并需要10秒才能完成.在另一个线程中是一个原子块,每秒修改一次TVar.第一个原子块是否会完成?当然它会一直回到开头,因为日志永远处于不一致的状态?
Tho*_*son 12
正如其他人所说:理论上并不能保证取得进展.在实践中,也无法保证取得进展:
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"
Run Code Online (Sandbox Code Playgroud)
以上从未在我的测试中说过"做长STM".
显然,如果你认为计算仍然有效/相关,那么你也想要
归档时间: |
|
查看次数: |
1204 次 |
最近记录: |