我对 Erlang NIF 中的线程有一点问题。你可以在这里查看我的代码:http: //pastebin.com/HMCj24Jp。问题是当我启动线程时,它需要一些参数并启动generate_binary函数。这没关系,但是当我试图阅读论点时,一切都崩溃了。
这可能不是最复杂的问题,但我找不到任何关于此的文档,所以我希望你们中的一些人可能知道答案。
我对 Erlang NIF 中的线程有一点问题。你可以在这里查看我的代码:http: //pastebin.com/HMCj24Jp。问题是当我启动线程时,它需要一些参数并启动generate_binary函数。这没关系,但是当我试图阅读论点时,一切都崩溃了。
这可能不是最复杂的问题,但我找不到任何关于此的文档,所以我希望你们中的一些人可能知道答案。
您的generate_buffer()
NIF 正在创建一个要调用的线程,generate_binary()
但调用 NIF 不会等待新创建的线程完成。线程刚刚被创建,并且在 NIF 返回时可能仍在运行,尽管这将是不确定的,因为线程通常是这样。您可能正在使 Erlang BEAM 仿真器崩溃,因为在返回generate_binary()
后尝试调用 Erlang 运行时系统generate_buffer()
,这使可怜的东西非常混乱。
现在,即使假设您修复此问题以使其执行您想要的操作,我认为您根本不应该在这里使用显式本机线程。
首先,Erlang NIF 应该看起来像常规的 Erlang 函数,不同之处仅在于它们碰巧是用不同的语言编写的。Erlang 函数不会产生单独的执行线程,然后返回,让该线程继续运行。除了那些处理 I/O 和持久数据存储的函数外,Erlang 函数是确定性和引用透明的。您的 NIF 两者都不是。因此,即使它有效,它仍然是“错误的”,因为它违反了经验丰富的 Erlang 程序员的期望。
其次,如果你需要多处理,Erlang 已经提供了进程的概念。如果你的 NIF 真的能做很多工作,它可以从多处理中受益,为什么不重新设计你的 NIF 以便它可以处理数据的子范围,然后多次调用它,每次从多个 Erlang 进程中调用一次?那么你就不需要显式的本地线程了;BEAM 模拟器会透明地为您创建最佳线程数。
第三,如果线程的生命周期仅在单个 Erlang NIF 调用的过程中延长,线程创建开销将降低性能,这似乎是您的实际意图。这是 Erlang 进程在这里会更高效的另一个原因。