我有一个C++代码,它通过串行端口实现了一个特殊的协议。该代码是多线程的,在内部轮询串行端口并进行自己的循环处理。我想打电话给这个来自erlang的司机,并接收来自这个司机的事件。我担心的是,这个C++代码是多线程的,也是有状态的,这意味着当我在驱动程序上调用某个函数时,它会在内部缓存一些东西,这些东西将在驱动程序的后续调用中使用/需要。我的问题是
1.NIF是在与我的其他erlang进程相同的操作系统进程中运行,还是在单独的操作系统过程中启动?
2.用NIF扭曲这个多线程有状态C++代码有意义吗?
4.如果NIF不是正确的方法,那么对我来说,让Elrang用这个C++代码来回交谈的更好方法是什么。我也更喜欢我的C++代码和我的其他Erlang进程在同一个操作系统进程中,因为它看起来像是链接的驱动程序是一种选择,但不确定我C++代码的多线程性质是否适合该模型。另外,我听说他们会打乱elrang的时间表?
-
与端口不同,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