Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell中的并发性:如果单线程但设置为+;RTS-N_Haskell_Ghc_Haskell Platform - Fatal编程技术网

Haskell中的并发性:如果单线程但设置为+;RTS-N

Haskell中的并发性:如果单线程但设置为+;RTS-N,haskell,ghc,haskell-platform,Haskell,Ghc,Haskell Platform,正如GHC文档所述,设置+RTS-N将使用多个线程来运行程序。如果我的程序是一个简单的单线程程序(即nopar,noforkIO),如下图所示,该怎么办 m = 10^6 wr 0 = return () wr i = do appendFile "/tmp/data.nothing" $ show(i)++"\n" wr (i-1) main = do wr m putStrLn "done" 但是,当我使用-Ds(调试调度器)标志运行

正如GHC文档所述,设置
+RTS-N
将使用多个线程来运行程序。如果我的程序是一个简单的单线程程序(即no
par
,no
forkIO
),如下图所示,该怎么办

m = 10^6

wr 0 = return ()
wr i = do  
        appendFile "/tmp/data.nothing" $ show(i)++"\n"
        wr (i-1)

main = do
    wr m
    putStrLn "done"
但是,当我使用
-Ds
(调试调度器)标志运行程序时,我得到了以下日志

all threads:
threads on capability 0:
threads on capability 1:
    thread    7 @ 0x7fd5b0199000 is not blocked (TSO_DIRTY)
    thread 1944 @ 0x7fd592dc6390 is not blocked (TSO_DIRTY)
    thread 1945 @ 0x7fd592def8a8 is not blocked
    thread 1946 @ 0x7fd592dc6790 is not blocked
    thread 1947 @ 0x7fd592e0f790 is not blocked
    thread 1948 @ 0x7fd592df2420 is not blocked
    thread 1949 @ 0x7fd592df2000 is not blocked
    thread 1950 @ 0x7fd592e0f000 is not blocked
    thread 1951 @ 0x7fd592ddae90 is not blocked
    thread 1952 @ 0x7fd5b0156cc0 is not blocked
    thread 1953 @ 0x7fd5b2a2adc8 is not blocked
    thread 1954 @ 0x7fd5b2920568 is not blocked
    thread 1955 @ 0x7fd592c4b5a0 is not blocked
    thread 1956 @ 0x7fd5b289e7a8 is not blocked (TSO_DIRTY)
    thread 1957 @ 0x7fd592c4e160 is not blocked (TSO_DIRTY)
    thread 1958 @ 0x7fd592dc54a8 is not blocked (TSO_DIRTY)

我真的很想知道这数千个线程在这里做什么?

GHC线程和OS线程之间存在混淆

“一个线程由GHC的TSO(线程状态对象)表示[…]线程由功能运行,可以认为是由GHC管理的虚拟内核。功能反过来映射到真正的操作系统线程或任务,尽管我们不会过多地讨论它们。”

另见

实际上,您需要的是功能。如果您使用
+RTS-N1
运行您的程序,您将看到只有一个功能,2个用于
+RTS-N2


您可能还注意到,即使您的程序本质上是单线程的,运行时系统也可以为其他任务(如垃圾收集器)使用不同的线程。

Wait。。。您明确告诉运行时创建线程。。。然后你想知道为什么它会这样做?哈?也许他把OS线程和sparks混淆了。你确定
appendFile
不会启动任何sparks吗?@Cubic是和否。通过设置+RTS-N,我希望ghc会创建8个OS线程来运行所有用户空间线程。但我不明白的是为什么有这么多线程(我没有用forkio等创建任何线程)。我刚开始学习Haskell,所以这个问题可能很愚蠢,但我很困惑。@bl4ck5un带有ID的线程可能只是绿色线程。每个功能都在各自的(OS)线程上运行,因此您可能只有两个OS线程显示在那里。但是我不知道你的问题的答案,我也不认为这与Spark有关(这是纯代码中的并行性,所以这里不太可能出现)。