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.由于我没有使用过任何其他图书馆,我很乐意听到任何使用/开发此类图书馆的人.
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 线程替换(现在这是强制功能)。
| 归档时间: |
|
| 查看次数: |
5220 次 |
| 最近记录: |