Erlang NIFs: блокировка потоков
Могут ли реализации NIF использовать обычные примитивы блокировки потоков C/C++ или они должны использовать API NIF (enif_mutex_lock(..), enif_mutex_create(..),
так далее.)
1 ответ
Потоки и параллелизм
NIF является поточно-ориентированным без какой-либо явной синхронизации, если он действует как чистая функция и читает только предоставленные аргументы. Как только вы пишете в общее состояние либо через статические переменные, либо через enif_priv_data, вам необходимо предоставить свою собственную явную синхронизацию. Это включает термины в независимых от процессов средах, которые совместно используются потоками. Ресурсные объекты также потребуют синхронизации, если вы рассматриваете их как изменяемые.
Так что ничто не мешает вам делать то, что вы хотите. Вы легко можете написать свой собственный мьютекс / семафор, а что нет. И вы можете сделать это на C или C++ или Rust.
Тем не менее, ничто не мешает все тормозить. Если вы что-то ломаете, вы ломаете это во всей ВМ Я бы попытался использовать стандартные способы работы Erlang, особенно при работе с потоками. Это проверенные методы, и я не нашел оснований для их замены на что-либо еще.