【发布时间】:2012-09-12 18:30:14
【问题描述】:
如果我使用 forkIO 创建一个线程,我需要提供一个函数来运行并取回一个标识符 (threadID)。然后我可以通过例如与这种动物交流。工作负载,MVAR 等。但是,据我了解,创建的线程非常有限,只能以 SIMD 方式工作,其中为线程创建提供的功能是指令。我无法更改启动线程时提供的功能。我知道这些用户线程最终是由操作系统映射到操作系统线程的。
我想知道 Haskell 线程和 OS 线程是如何交互的。为什么做完全不同的事情的 Haskell 线程可以映射到同一个 OS 线程?为什么不需要使用固定指令启动 OS 线程(因为它在 forkIO 中是必需的)?调度程序(?)如何识别可能分布的应用程序中的用户线程?换句话说,为什么操作系统线程如此灵活?
最后,有没有办法从应用程序中转储选定线程的堆?
【问题讨论】:
-
你可能有兴趣阅读community.haskell.org/~simonmar/papers/conc-ffi.pdf,它很好地解释了多线程Haskell的实现。它有点旧,但仍然非常相关。尽管有标题,但它的意义远不止 FFI。