2010-08-05 102 views
5

我在Erlang NIF的线程中遇到了一些问题。你可以在这里查看我的代码:http://pastebin.com/HMCj24Jp。问题是,当我启动线程它需要一些参数,并启动generate_binary函数。这是好的,但当我试图读取所有参数崩溃。Erlang NIF和线程的问题

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

回答

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