gpt4 book ai didi

multithreading - Haskell中并发的奇怪行为

转载 作者:行者123 更新时间:2023-12-04 14:47:45 25 4
gpt4 key购买 nike

我有以下代码:

import Control.Concurrent

sleepSort = mapM_ (forkIO . put)
where put x = threadDelay (x*10000) >> print x

这对一组整数执行 sleep 排序,并且工作正常,除了一个警告:

程序按顺序打印出数据集中的每个数字,就像它应该做的那样。但是,在打印完最后一个数字后,它会等待用户输入某个数字,然后回显该数字,然后完成。

我认为我在任何时候都不会要求用户输入,那么为什么会发生这种情况呢?

最佳答案

发生这种情况是因为您的主线程不等待其他线程完成。您的程序启动了 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]

关于multithreading - Haskell中并发的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12116347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com