我有一个C++代码,通过串口实现一个特殊的协议.代码是多线程的,并在内部轮询串行端口并执行自己的循环处理.我想从erlang调用此驱动程序,并从此驱动程序接收事件.我担心的是这个C++代码是多线程的,也是状态的,这意味着当我在驱动程序上调用某个函数时,它会在内部缓存内容,这些内容将在后续的驱动程序调用中使用/需要.我的问题是
1. NIF是否在与我的erlang程序的其余部分相同的操作系统进程中运行,或者NIF是在单独的操作系统进程中启动的?
2.用NIF扭曲这个多线程有状态C++代码是否有意义?
4.如果NIF不是正确的方法,那么让我更好的方法是让Elrang用这个C++代码来回说话.我也更喜欢我的C++代码与我的其他Erlang进程在同一个操作系统进程中,因为它看起来像链接驱动程序是一个选项,但不确定我的C++代码的多线程性质是否可以模型.另外我听说他们可以弄乱elrang调度程序?
小智 4
与端口不同,NIF 在 Erlang VM 进程内运行,类似于驱动程序。因此,任何 NIF 崩溃也会导致 VM 宕机。而且,提前回答你的最后一个问题,NIF 就像驱动程序一样,可能会阻止你的调度程序。
这取决于您通过此 C++ 代码实现的功能。由于答案 1),您可能希望避免 C++ 部分中的并发,因为它是潜在的错误源。当然,这并不总是可能的。但是,如果您要实现一些工作池,请继续实现 1 线程代码,根据需要多次生成它。
驱动程序也可以是多线程的,具有相同的潜在问题和非常相似的性能(嗯,仍然比 NIF 稍快)。如果您不完全确定 C++ 代码的稳定性,请将其用作 Erlang 端口。
说到 NIF 和驱动程序之间的区别,前者本身是同步的,而后者可以是异步的(如果您不想收到大多数命令的任何答案,这确实是一个巨大的优势)。驱动程序更容易搞砸,也更难实现(但是一旦你掌握了主要模式和问题,实际上它们看起来还不错)。
对于驱动程序来说,这是一个好的开始: http://www.erlang.org/doc/apps/erts/driver.html
NIF 也有类似的东西(看看复杂性的差异): http://www.erlang.org/doc/tutorial/nif.html