哪些绿色线程库可用于C,可以匹配Haskell绿色线程的性能和易用性?

Cet*_*ert 23 c concurrency networking haskell green-threads

forkIO在Haskell中编程时,我习惯于依赖GHC 用于可移植轻量级线程.

什么是C的等效库,可以提供相同的可扩展性和易用性?

具体来说,我需要C等价物至少以下两个功能.

forkIO     :: IO () -> IO ThreadId
killThread ::             ThreadId -> IO ()
Run Code Online (Sandbox Code Playgroud)

我假设我的应用程序,如果线程只打开阻塞操作而不是被强制挂起就足够了,因为所有线程都经常阻塞网络IO,我只使用splice系统调用要求Linux内核在套接字之间推送数据.


更新

本文比较了数字和表格

结果有利于Protothreads.由于我没有使用过任何其他图书馆,我很乐意听到任何使用/开发此类图书馆的人.

Mar*_*her 7

libMill可能就是您要搜索的内容:http://libmill.org/

它以Go-Lang通道样式实现用户级线程.

它由ZeroMQ的创建者http://250bpm.com/的超级聪明的MartinSústrik开发.所以它一定很好☺


R..*_*R.. -18

使用 POSIX 线程。它们在任何现代实现上都是“绿色”的,不是“绿色线程”的意义上,而是轻量级和高效的意义上。没有可移植的方法可以在普通 C 或 POSIX minus 线程之上滚动您自己的线程。正如OP提到的,有一些库以不可移植的方式实现绿色线程/协同例程(尽管通常声称可移植性)。

最接近可移植的方法是使用makecontext/ swapcontext,不幸的是,这不能很好地执行,因为它必须进行系统调用来保存/恢复“线程”之间每次切换的信号掩码。这使得“绿色”线程之间的切换比“真实”POSIX 线程实现上内核级线程之间的上下文切换更昂贵,并且基本上否定了“绿色线程”的任何声称的好处。

不关心信号掩码的不可移植方法可以使用特定于机器的 asm 完全在用户空间中进行上下文切换,并且理论上比内核级线程执行得更好,但一旦性能出现问题,性能就会再次飞出窗口。你引入了 IO,因为即将执行 IO 的线程必须首先进行昂贵的测试来检查操作是否会阻塞,如果是,则将控制权移交给不同的线程。

我坚持我的立场,即“绿色线程”这个想法的时代早已过去。这似乎也是 Austin Group(负责 POSIX)的立场,他们删除了ucontextPOSIX 2008 中的功能并建议用 POSIX 线程替换(现在这是强制功能)。

  • POSIX 线程绝对不是*绿色线程,因为该术语[通常被理解](http://en.wikipedia.org/wiki/Green_thread)。POSIX 线程的 Linux 实现始终以与 POSIX 线程一一对应的方式创建操作系统级线程,Solaris、FreeBSD 和 NetBSD 在其历史上的某个时刻都切换到了一对一模型。 (13认同)
  • @R.. http://hpaste.org/80868 创建 1M 线程。使用 256 字节的线程堆栈,总共分配 300M,并在 2.7 秒内完成。我*喜欢*看到 Posix 线程的等效缩放。 (13认同)
  • 我可以在一台普通笔记本电脑上启动 1M Posix 线程吗? (12认同)
  • 即使绿色线程概念已经过时(这是有争议的),*术语*也有明确的定义,并且“[POSIX 线程] 在任何现代实现上都是‘绿色’”的说法是错误的。正如我所写,POSIX 线程的所有现代实现都是到操作系统 LWP 的一对一映射,这与绿色线程正好相反。 (8认同)
  • ...这告诉您 Haskell 线程_可以_分布在多个核心上,因此不会因为您假设的原因而过时,@R..,并且肯定比操作系统线程轻得多。 (6认同)
  • 真的吗?您的论点同时是:1)绿色线程不是一个有用的想法,2)您建议的替代方案不能与已建立的绿色线程实现竞争?这真是*迷人*。在发布听起来权威的答案之前,您确实应该考虑更多地了解并发性。 (4认同)
  • @R ..如果你真的说Haskell的线程性能确实不可能在C中复制,那么最好编辑你的问题以强调这一点和你的推理。目前,这听起来仍然有点像对绿色线程概念的咆哮。(它已经比草案 1 好得多了。) (3认同)
  • http://en.wikipedia.org/wiki/Green_threads (2认同)
  • (源代码中没有明确请求 256 字节线程堆栈,因为它是运行时系统选项。您不会在 Haskell 代码中进行显式内存管理。) (2认同)