【问题标题】:Erlang and C/C++ ThreadingErlang 和 C/C++ 线程
【发布时间】:2011-04-27 15:14:48
【问题描述】:
如果我将 erlang 用作生成器进程,它会执行对速度不太重要的主要功能,例如与服务器通信和处理服务器-客户端通信消息。
然后我选择在 erlang 中生成一个进程并从中运行 c/c++ 代码,这会让我的代码更快吗?
erlang 会比 c/c++ 中的等价物更有效地处理多线程吗?
如果我要从 erlang 生成许多 c 节点,它们会堆叠在单个内核上还是 erlang 会处理多线程。这是我想知道的要点。
【问题讨论】:
标签:
c++
multithreading
erlang
【解决方案1】:
您在问题中谈到了两个不同的概念:运行 C/C++ 代码的 Erlang 进程和 C 节点。
从 Erlang 内部运行的 C 或 C++ 代码根本没有调度。实际上,它会阻塞当前 CPU 内核的 Erlang 调度程序,因此在 C 语言中运行时间过长很可能会打乱您的 (Erlang) 调度。
例如,在四核处理器上,Erlang 默认创建 4 个调度线程,每个线程占用一个内核。任何运行 C 代码的进程都会阻塞分配给它的调度程序,直到该代码完成执行。
运行 C 节点时,您完全靠自己。 Erlang 节点根本不知道 C 节点的调度,它只关心自己的调度。当然,您可以创建自己的调度,例如将一个核心专用于 C 节点,三个专用于 Erlang 节点或类似的东西。
【解决方案2】:
Erlang 只使用自己的轻量级进程来管理并发,这些进程不是基于线程的。它通常只运行几个线程来服务它可以产生的数千个进程,当启用 SMP 时,每个 CPU/核心通常只有一个线程。
它肯定对任何外部线程一无所知,任何外部进程只会增加通信开销以及在外部进程中管理内存和资源的复杂性。