在erlang nif中创建脏线程

ziv*_*ziv 3 erlang multithreading erl erlang-nif

我有点困惑,当我创建一个脏 NIF 时(例如,通过在其 ErlNifFunc 条目中为脏 NIF 设置适当的标志值),这会创建一个在脏线程上运行的脏调度程序。

我知道我只能有 N 个 cpu-bond 脏线程作为 N 个 cpu 核心的数量。但是,还有enif_thread_create函数。

它们之间有什么区别?使用 enif_thread_create 创建的线程是否有限制?它们也会是脏线程吗?我希望有一个通过 enif_thread_create 使用脏线程的简单代码示例。

Ste*_*ski 5

当您将 NIF 定义为脏时,您就是在告诉 VM 仅通过脏调度程序来执行它。你并不是在创建一个肮脏的调度程序;而是在创建一个肮脏的调度程序。只有虚拟机才能做到这一点。

默认情况下,VM 为您提供 N 个脏 CPU 调度程序,其中 N 是正常调度程序的数量。普通调度程序的数量默认为系统上配置的逻辑处理器的数量。erl正如手册页中所解释的,正常和脏调度程序的数量可以通过各种命令行选项进行控制。

enif_thread_create函数提供对底层操作系统的线程创建功能的访问。该函数早于脏 NIF 和调度程序就已经存在,而且本质上也早于普通 NIF,因为它只是该erl_drv_thread_create函数的包装器,而该函数已经成为驱动程序 API 的一部分已有相当长一段时间了。这些线程独立于调度程序线程,因此与 NIF 调度无关。相反,它们更像是常规 C 或 C++ 程序可能创建和使用的线程。换句话说,Erlang 运行时使用调度程序线程来运行 Erlang 作业,包括通过脏调度程序进行的脏作业,而您的内部 NIF 或驱动程序代码可以使用它通过(大部分)独立于 Erlang 运行时运行的作业创建的enif_thread_create线程erl_drv_thread_create。通过这些函数可以创建的最大线程数受到底层操作系统的限制。