3

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

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

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

4

1 回答 1

4

当您将 NIF 定义为脏时,您是在告诉 VM 仅通过脏调度程序执行它。您不是在创建肮脏的调度程序;只有虚拟机这样做。

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

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

于 2020-08-23T22:51:00.280 回答