我不确定forkIO
/ forkOS
和forkProcess
之间在Haskell中的区别。据我了解,forkIO
/ forkOS
更像是线程(类似于C中的pthread_create
),而forkProcess
则启动一个单独的过程(类似于fork
)。
答案 0 :(得分:8)
forkIO
创建一个轻量级的未绑定绿色线程。绿色线程的开销很小; GHC运行时能够在一小组OS工作线程上有效地复用数百万个绿色线程。绿色线程可能在其生命周期内存在于多个OS线程中。
forkOS
创建一个绑定线程:一个绿色线程,保证FFI调用在一个固定的OS线程上进行。绑定线程通常在与使用线程局部数据的C库交互时使用,并期望所有API调用都来自同一线程。从the paper指定GHC的绑定线程:
这个想法是每个绑定的Haskell线程都有一个专用的关联 OS线程。保证由绑定的Haskell进行的任何FFI调用 线程由其关联的OS线程构成,尽管是纯Haskell 当然,执行可以由任何OS线程执行。一群 因此可以保证外部呼叫可以由相同的OS执行 线程,如果它们都在一个绑定的Haskell线程中执行。
[...]
[F]或每个OS线程,最多只有一个绑定的Haskell线程。
请注意,上述引用并未排除与绑定线程关联的OS线程可以充当未绑定Haskell线程的工作线程的可能性。它也不保证绑定线程的非FFI代码将在任何特定线程上执行。
forkProcess
创建一个新进程,就像UNIX上的fork
一样。
答案 1 :(得分:4)
forkIO
创建一个由Haskell运行时系统管理的轻量级线程。它是未绑定的,即它可以由任何OS线程运行。
forkOS
创建绑定线程,这意味着它绑定到实际的OS线程。例如,在使用C函数时,这可能是必要的。
forkProcess
分叉当前流程,例如C中的fork()
。