【问题标题】:Creating dirty threads in erlang nif在erlang nif中创建脏线程
【发布时间】:2020-12-12 13:00:22
【问题描述】:

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

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

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

【问题讨论】:

    标签: multithreading erlang erl erlang-nif


    【解决方案1】:

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

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

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

    【讨论】:

    • 使用这个包络函数 enif_thread_create / erl_drv_thread_create 比使用 std::thread 创建一个新线程来处理 Erlang VM 之外的东西有什么好处?
    • 对于非 Erlang 任务,我认为使用包装器的唯一好处是它们提供的可移植性——它们保证可以在 Erlang VM 工作的任何地方工作。但与 std::thread 或其他可移植线程 API 相比,它们没有提供任何额外的可移植性优势。
    猜你喜欢
    • 2015-01-02
    • 2011-03-25
    • 2016-10-06
    • 1970-01-01
    • 2013-01-03
    • 2012-03-20
    • 2012-01-07
    • 2016-03-30
    • 2012-11-18
    相关资源
    最近更新 更多