下面的程序创建了两个并发运行的线程,每个线程随机休眠一段时间,然后将一行文本打印到标准输出。
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 事务都必须有STM a
some的类型a
,而打印到屏幕上的动作有 type IO a
,而且似乎没有办法嵌入IO
到STM
中。