发生这种情况是因为您的主线程不会等待其他线程完成。您的程序启动n线程,但主线程立即退出,并返回到解释器提示符。同时,其他线程继续产生输出:
Prelude Control.Concurrent> sleepSort [1,2,3]
1
Prelude Control.Concurrent> 2
3
您可以通过添加延迟主线程解决这个问题:
Prelude Control.Concurrent> sleepSort [1,2,3] >> threadDelay 10000
1
2
3
如果你正在运行一个编译的程序,它只是立即退出而不打印任何东西:
$ cat Test.hs
import Control.Concurrent
sleepSort = mapM_ (forkIO . put)
where put x = threadDelay (x*1000) >> print x
main = sleepSort [1,2,3]
$ ghc --make -O2 Test.hs
[1 of 1] Compiling Main (Test.hs, Test.o)
Linking Test ...
$ ./Test
$
更新:而不是增加threadDelay
一个电话main
,您可以在sleepSort
函数中使用信号量:
import Control.Concurrent
import Control.Concurrent.QSemN
sleepSort l = do
qsem <- newQSemN 0
mapM_ (forkIO . put qsem) l
waitQSemN qsem n
where
n = length l
put qsem x = threadDelay (x*1000) >> print x >> signalQSemN qsem 1
main = sleepSort [1,2,3]
您是否在使用GHCi?如果是这样,它可能会以一种似乎需要并随后回响一个数字的方式表现古怪?如果不是,你的'main'是什么样的? – gspr
如果您在GHCi中尝试使用此功能,请尝试输入'print'作为用户输入。 – Vitus