Erlang NIF和线程的问题

时间:2010-08-05 15:10:18

标签: c erlang erlang-nif

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

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

1 个答案:

答案 0 :(得分:9)

您的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流程在这里更有效的另一个原因。