gpt4 book ai didi

haskell - Haskell 中的并发 : What if single thread but set +RTS -N

转载 作者:行者123 更新时间:2023-12-04 23:20:59 24 4
gpt4 key购买 nike

正如 GHC 文档所说,设置 +RTS -N将使用多个线程来运行程序。如果我的程序是一个简单的单线程程序(即没有 par ,没有 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 管理的虚拟内核。反过来,功能映射到真正的操作系统线程,或任务,尽管我们不会过多谈论它们。”

Inside 206-105 − The GHC scheduler

另见 The Glasgow Haskell Compiler − The Scheduler

你真正在寻找的是能力。如果你用 +RTS -N1 运行你的程序你会看到只有一种能力,2 表示 +RTS -N2等等。

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

关于haskell - Haskell 中的并发 : What if single thread but set +RTS -N,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27054388/

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