Erlang NIF和线程的问题

Bur*_*bas 5 c erlang erlang-nif

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

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

War*_*ung 9

您的generate_buffer()NIF正在创建一个要调用的线程,generate_binary()但调用NIF不会等待新创建的线程完成.线程刚刚被创建,并且可能在NIF返回时仍在运行,尽管这通常是不确定的,因为线程通常是这样.您可能正在崩溃Erlang BEAM模拟器,因为generate_binary()它在generate_buffer()返回后试图调用Erlang运行时系统,可怕地混淆了可怜的东西.

现在,即使你假设你修复它以使它做你想做的事情,我也不认为你应该在这里使用显式本机线程.

首先,Erlang NIF应该看起来像常规的Erlang函数,区别仅在于它们恰好用不同的语言编写.Erlang函数不会产生单独的执行线程,然后返回,让该线程继续运行.除了处理I/O和持久数据存储的那些,Erlang函数是确定性的并且是引用透明的.你的NIF不是.因此,即使它起作用,它仍然是"错误的",因为它违反了经验丰富的Erlang程序员的期望.

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

第三,如果线程的生命周期只延伸到单个Erlang NIF调用的过程中,那么线程创建开销将会破坏性能,因为它似乎是您真正想要的.这是Erlang进程在这里更有效的另一个原因.