类似Erlang的线程替代或erl_nif性能

时间:2012-11-20 10:00:35

标签: c++ c erlang

我非常喜欢Erlang的线程架构(小型廉价线程和“无共享”架构),但似乎Erlang并不适合我的应用程序(这些东西在C / C ++中会更高效,而Erlang并不是最好的。)

好吧,正如我已经说过的,我真的很喜欢Erlang的线程架构(它不使用OS线程)。所以,我的问题是 - 是否有任何类似的库实现这种架构在C / C ++代码中的使用?至于我的谷歌,找不到比Java的“绿色线程”(很久以前弃用并从当前版本中删除)和D的“光纤”更好的东西(限于一个“真正的”线程,而Erlang线程由Erlang在最合适的“真实”线程上执行,它们有点类似,但没有Erlang线程那么强大。

如果没有这样的库,我正在考虑使用erl_nif接口在C / C ++中编写所需的代码块。但我无法找到任何性能分析 - erl_nif是快速的,还是将Erlang术语/数据类型“转换”为C / C ++类型的开销真的很大?

谢谢!

3 个答案:

答案 0 :(得分:2)

Akka提供了Erlang风格的actor,但是对于Java / Scala,而不是C / C ++。

从我所读过的内容(例如http://www.scribd.com/doc/87376094/Erlang-and-OTP-in-Action#outer_page_324)来看,NIF很快但有潜在危险,因为它们可能导致整个Erlang程序崩溃。您可以尝试使用Erlang端口(http://www.erlang.org/doc/reference_manual/ports.html)与C / C ++进行通信,这样更安全,因为端口将非Erlang代码与Erlang监督树分开

答案 1 :(得分:2)

你所追求的是“演员模特”

有很多C ++库可以实现它

  1. libcppa
  2. 演员-CPP
  3. 塞隆
  4. 哪一个更好完全取决于您的特定用例。

    但请注意,与erlang的流程相比, none 可以同时执行廉价线程和抢先任务切换。您可以将您的actor映射到工作服务器操作系统线程1对1并进行抢先切换,或使用基于事件的参与者和协作式多任务处理。

答案 2 :(得分:1)

erl_nif 使用操作系统线程:

  

避免在NIF调用中进行冗长的工作,因为这可能会降低VM的响应能力。 NIF由执行调用Erlang代码的同一调度程序线程直接调用。因此,在NIF返回之前,将禁止调用调度程序执行任何其他工作。

所以看起来Akka可能是你的最佳选择。