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