当许多 Erlang 进程同时调用 C NIF 时,我观察到它们的阻塞行为。可以做到无阻塞吗?这里有mutex
我无法理解的工作吗?
PS 一个基本的“Hello world”NIF 可以通过将其设为sleep
100来进行测试microseconds
,以防特定PID
调用它。可以观察到,调用 NIF 的其他 PID 在执行之前等待该睡眠执行。
在并发可能不会造成问题的情况下(例如数组推送、计数器增量),非阻塞行为将是有益的。
我正在分享 4 个要点的链接,这些要点分别由 a和spawner
module组成。我试图修改 的值,并且确实观察到了非阻塞行为。这可以通过为函数分配一个大整数参数来确认。conc_nif_caller
niftest
Val
spawn_multiple_nif_callers
链接 spawner.erl、conc_nif_caller.erl、niftest.erl和最后的 niftest.c。
下面的行是由我的 Mac 上的 Erlang REPL 打印的。
Erlang/OTP 17 [erts-6.0] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]