0

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

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

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

谢谢!

4

3 回答 3

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 监督树分开,因此更安全.

于 2012-11-20T10:08:25.030 回答
2

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

有相当多的 C++ 库实现它

  1. libcppa
  2. 演员-CPP
  3. 塞隆

哪个更好完全取决于您的特定用例。

但是请注意,与 erlang 的进程相比,它们不能同时进行廉价线程和抢占式任务切换。您可以将您的参与者一对一映射到工作操作系统线程并进行抢先切换,或者使用基于事件的参与者和协作多任务处理。

于 2012-11-20T10:10:18.447 回答
1

erl_nif 确实使用操作系统线程:

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

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

于 2012-11-20T12:14:45.360 回答