gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:24:57 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

  • 与端口不同,NIF 在 Erlang VM 进程中运行,类似于驱动程序。因此,任何 NIF 崩溃也会导致 VM 停机。而且,提前回答您的最后一个问题,NIF 和驱动程序一样,可能会阻止您的调度程序。
  • 这取决于您通过此 C++ 代码实现的功能。由于答案 1),您可能希望避免 C++ 部分中的并发,因为它是潜在的错误来源。当然,这并不总是可能的。但是,如果您正在实现,例如,一些 worker 池,请继续实现 1 线程代码,根据需要多次生成它。
  • 驱动程序也可以是多线程的,具有相同的潜在问题和非常相似的性能(嗯,仍然比 NIF 稍快)。如果你不能完全确定你的 C++ 代码稳定性,可以将它用作 Erlang 移植。

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

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

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

    关于erlang - NIF 包装我的多线程 C++ 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12589300/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com