【发布时间】:2014-01-18 05:37:29
【问题描述】:
以下程序创建两个并发运行的线程,每个线程随机休眠一段时间,然后将一行文本打印到标准输出。
import Control.Concurrent
import Control.Monad
import System.Random
randomDelay t = randomRIO (0, t) >>= threadDelay
printer str = forkIO . forever $ do
randomDelay 1000000 -- μs
putStrLn str
main = do
printer "Hello"
printer "World"
return ()
输出通常看起来像
>> main
Hello
World
World
Hello
WoHrelld
o
World
Hello
*Interrupted
>>
如何确保一次只有一个线程可以写入标准输出?这似乎是 STM 应该擅长的那种事情,但是所有 STM 事务对于某些 a 必须具有 STM a 类型,并且打印到屏幕的操作具有 IO a 类型,并且没有似乎是将IO 嵌入STM 的一种方式。
【问题讨论】:
标签: multithreading haskell io stm io-monad