Điều này xảy ra vì chủ đề chính của bạn không chờ cho các chủ đề khác hoàn thành. Chương trình của bạn bắt đầu n luồng, nhưng chuỗi chính sẽ thoát ngay lập tức và bạn sẽ quay lại lời nhắc thông dịch viên. Trong khi đó các chủ đề khác tiếp tục sản xuất ra:
Prelude Control.Concurrent> sleepSort [1,2,3]
1
Prelude Control.Concurrent> 2
3
Bạn có thể khắc phục điều này bằng cách thêm một sự chậm trễ đến các chủ đề chính:
Prelude Control.Concurrent> sleepSort [1,2,3] >> threadDelay 10000
1
2
3
Nếu bạn đang chạy một chương trình biên dịch, nó sẽ chỉ thoát ngay mà không cần bất cứ điều gì in:
$ 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
$
cập nhật: Thay vì thêm một cuộc gọi đến threadDelay
-main
, bạn có thể sử dụng một semaphore trong sleepSort
chức năng:
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]
Nguồn
2012-08-24 22:35:48
Bạn đang sử dụng GHCi? Nếu vậy, liệu nó có thể diễn xuất kỳ quặc theo một cách có vẻ như mất và sau đó lặp lại một số không? Nếu không, cái 'main' của bạn trông như thế nào? – gspr
Nếu bạn đang thử điều này trong GHCi, hãy thử gõ 'print' làm đầu vào của người dùng. – Vitus