C NIF が多くの Erlang プロセスによって同時に呼び出されたときに、それらのブロック動作を観察しました。ノンブロッキングにすることはできますか?私がmutex
理解できないことがここで働いていますか?
PS基本的な「Hello world」NIFは、特定の呼び出しの場合にsleep
100を作成することでテストできます。NIF を呼び出している他の PID は、スリープが実行されるのを待ってから実行されることがわかります。microseconds
PID
非ブロッキング動作は、並行性が問題を引き起こさない可能性がある場合 (配列のプッシュ、カウンターのインクリメントなど) に役立ちます。
spawner
、conc_nif_caller
およびniftest
モジュールでそれぞれ構成される 4 つの要点へのリンクを共有しています。の値をいじってみましたが、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]