【问题标题】:Problems with Erlang NIF and threadsErlang NIF 和线程的问题
【发布时间】:2011-03-25 21:01:00
【问题描述】:

我对 Erlang NIF 中的线程有一点问题。你可以在这里查看我的代码:http://pastebin.com/HMCj24Jp。问题是当我启动线程时,它需要一些参数并启动 generate_binary 函数。这没关系,但是当我试图阅读论点时,一切都崩溃了。

这可能不是最复杂的问题,但我找不到任何有关此的文档,所以我希望你们中的一些人可能知道答案。

【问题讨论】:

    标签: c erlang erlang-nif


    【解决方案1】:

    您的generate_buffer() NIF 正在创建一个线程来调用generate_binary(),但调用 NIF 不会等待新创建的线程完成。线程刚刚被创建,并且在 NIF 返回时可能仍在运行,尽管这将是不确定的,因为线程通常是这样。您可能正在使 Erlang BEAM 仿真器崩溃,因为 generate_binary()generate_buffer() 返回后尝试调用 Erlang 运行时系统,这让可怜的东西非常混乱。

    现在,即使假设您修复此问题以使其按照您的意愿行事,我认为您根本不应该在此处使用显式本机线程。

    首先,Erlang NIF 应该看起来像常规的 Erlang 函数,不同之处仅在于它们碰巧是用不同的语言编写的。 Erlang 函数不会产生单独的执行线程,然后返回,让该线程继续运行。除了处理 I/O 和持久数据存储的那些之外,Erlang 函数是确定性的并且referentially transparent。您的 NIF 两者都不是。因此,即使它有效,它仍然是“错误的”,因为它违反了有经验的 Erlang 程序员的期望。

    其次,如果你需要多处理,Erlang 已经提供了进程的概念。如果你的 NIF 真的会做很多工作,它可以从多处理中受益,为什么不重新设计你的 NIF 以便它可以处理数据的子范围,然后多次调用它,每次从多个 Erlang 进程中调用一次?那么你就不需要显式的本地线程了; BEAM 模拟器会透明地为您创建最佳线程数。

    第三,如果线程的生命周期仅在单个 Erlang NIF 调用的过程中延长,线程创建开销将降低性能,这似乎是您的实际意图。这是 Erlang 进程在这里效率更高的另一个原因。

    【讨论】:

      猜你喜欢
      • 2015-01-02
      • 2020-12-12
      • 2012-11-18
      • 2016-10-06
      • 2019-03-12
      • 2020-05-17
      • 2012-01-07
      • 2016-03-30
      • 1970-01-01
      相关资源
      最近更新 更多