NIF包装我的多线程C++代码

iCo*_*ode 6 erlang erlang-nif

我有一个C++代码,通过串口实现一个特殊的协议.代码是多线程的,并在内部轮询串行端口并执行自己的循环处理.我想从erlang调用此驱动程序,并从此驱动程序接收事件.我担心的是这个C++代码是多线程的,也是状态的,这意味着当我在驱动程序上调用某个函数时,它会在内部缓存内容,这些内容将在后续的驱动程序调用中使用/需要.我的问题是

1. NIF是否在与我的erlang程序的其余部分相同的操作系统进程中运行,或者NIF是在单独的操作系统进程中启动的?

2.用NIF扭曲这个多线程有状态C++代码是否有意义?

4.如果NIF不是正确的方法,那么让我更好的方法是让Elrang用这个C++代码来回说话.我也更喜欢我的C++代码与我的其他Erlang进程在同一个操作系统进程中,因为它看起来像链接驱动程序是一个选项,但不确定我的C++代码的多线程性质是否可以模型.另外我听说他们可以弄乱elrang调度程序?

小智 4

  1. 与端口不同,NIF 在 Erlang VM 进程内运行,类似于驱动程序。因此,任何 NIF 崩溃也会导致 VM 宕机。而且,提前回答你的最后一个问题,NIF 就像驱动程序一样,可能会阻止你的调度程序。

  2. 这取决于您通过此 C++ 代码实现的功能。由于答案 1),您可能希望避免 C++ 部分中的并发,因为它是潜在的错误源。当然,这并不总是可能的。但是,如果您要实现一些工作池,请继续实现 1 线程代码,根据需要多次生成它。

  3. 驱动程序也可以是多线程的,具有相同的潜在问题和非常相似的性能(嗯,仍然比 NIF 稍快)。如果您不完全确定 C++ 代码的稳定性,请将其用作 Erlang 端口。

说到 NIF 和驱动程序之间的区别,前者本身是同步的,而后者可以是异步的(如果您不想收到大多数命令的任何答案,这确实是一个巨大的优势)。驱动程序更容易搞砸,也更难实现(但是一旦你掌握了主要模式和问题,实际上它们看起来还不错)。

对于驱动程序来说,这是一个好的开始: http://www.erlang.org/doc/apps/erts/driver.html

NIF 也有类似的东西(看看复杂性的差异): http://www.erlang.org/doc/tutorial/nif.html

  • 如果你想获得你所讨论的异步行为,你应该使用 http://www.erlang.org/doc/man/erl_nif.html#enif_thread_create 创建一个线程,然后在其中执行你的 C++ 代码。管道或类似的东西与该线程通信并使用 enif_send_term 发回结果。实现一个驱动程序可能更适合您,因为您可以使用内置的 erlang 异步线程池来执行 C++ 操作。在非 smp 模拟器中运行时,驱动程序也往往更加灵活(与 smp:1:1 不同)。 (2认同)