【问题标题】:NIF to wrap my multi-threaded C++ codeNIF 包装我的多线程 C++ 代码
【发布时间】:2012-09-17 08:17:18
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: erlang erlang-nif


    【解决方案1】:
    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

    【讨论】:

    • 感谢您的回答。问题是我无法更改 C++ 代码,它在内部创建了一些有限的线程。此外,它还锁定了一些内部数据结构,nif 调用可能会访问这些数据结构,因此 nif 调用可能会阻塞,直到内部线程释放锁定。假设 c++ 代码没有错误,那还可以吗?另外,在我看来,所有 Erlang 进程都只在一个线程上运行(我只有一个核心),而 vm 不使用任何线程池?这是正确的吗?如果是这样,我们如何在 Erlang 中获得并发性,因为我们永远不知道每个 erlang 进程需要多长时间?
    • 如果你想获得你所说的异步行为,你应该使用erlang.org/doc/man/erl_nif.html#enif_thread_create 创建一个线程,然后在其中执行你的 C++ 代码。你使用管道或类似的东西与该线程通信并使用 enif_send_term 发回结果。实现驱动程序可能更适合您,因为您可以使用内置的 erlang 异步线程池来执行 C++ 操作。在非 smp 仿真器中运行时,驱动程序也往往更加灵活(与 smp:1:1 不同)。
    • Erlang 的线程数对并发影响不大。 VM 调度程序只是加载所有进程之间的 CPU 时间(根据它们的优先级,默认情况下这是正常的,您可以为每个进程显式设置)。您可以从这里更好地了解 Erlang 进程:c2.com/cgi/wiki?GreenVsNativeThreads
    • 通常不允许在 NIF 调用期间阻塞或等待,但 Erlang R17 引入了允许这样做的“脏 io 调度程序”。简而言之,VM 将在单独的线程中运行您的 NIF,这样调度程序线程就不会受到您的阻塞/等待的影响。
    猜你喜欢
    • 2016-03-26
    • 1970-01-01
    • 2013-05-22
    • 2015-01-02
    • 1970-01-01
    • 2011-03-25
    • 2017-04-17
    • 1970-01-01
    • 2018-05-19
    相关资源
    最近更新 更多