6

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

1.NIF是否与我的其他erlang进程在同一个操作系统进程中运行,或者NIF是否在单独的操作系统进程中启动?

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

4.如果 NIF 不是正确的方法,那么让 Elrang 与这段 C++ 代码来回交谈的更好方法是什么。我也更喜欢我的 C++ 代码与我的其他 Erlang 进程位于同一个 OS 进程中,因为看起来链接驱动程序是一种选择,但不确定我的 C++ 代码的多线程性质是否可以接受模型。另外,我听说他们会搞砸 elrang 调度程序?

4

1 回答 1

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

于 2012-09-25T22:50:11.793 回答