Мне очень нравится архитектура потоков Erlang (небольшие дешевые потоки и архитектура «ничего не делить»), но кажется, что Erlang не совсем подходит для моего приложения (эти вещи были бы более производительными в C / C ++, в то время как Erlang не лучше всего)
Ну, как я уже сказал, мне ДЕЙСТВИТЕЛЬНО нравится архитектура потоков Erlang (которая не использует потоки ОС). Итак, мой вопрос — есть ли подобная библиотека, которая реализует эту архитектуру для использования в коде C / C ++? Насколько я могу судить, я не смог найти ничего лучше, чем «зеленые потоки» Java (устарел давно и удален из текущих версий) и «волокна» D (ограничен одним «реальным» потоком, в то время как Erlang Erlang выполняет потоки на наиболее подходящей «реальной» нити), которые несколько похожи, но не так мощны, как нити Erlang.
Если такой библиотеки нет, я подумываю использовать erl_nif Интерфейс для написания необходимых кусков кода на C / C ++. Но я нигде не смог найти никакого анализа производительности — быстр ли erl_nif или издержки по «преобразованию» терминов / типов данных Erlang в типы C / C ++ действительно велики?
Спасибо!
Akka предлагает актеров в стиле Erlang, но для Java / Scala, а не для C / C ++.
Из того, что я прочитал (например, http://www.scribd.com/doc/87376094/Erlang-and-OTP-in-Action#outer_page_324), NIF быстрые, но потенциально опасные в том смысле, что они могут привести к сбою всей программы Erlang. Вы можете попробовать использовать порты Erlang (http://www.erlang.org/doc/reference_manual/ports.html) для связи с C / C ++, что более безопасно, так как порт хранит не-Erlang-код отдельно от дерева контроля Erlang ,
То, что вы ищете, называется «модель актера»
Есть немало библиотек C ++, которые реализуют это
Какой из них лучше, зависит полностью от вашего конкретного случая использования.
Однако следует помнить, что в отличие от процессов Эрланга, никто из них могут выполнять как дешевые потоки, так и упреждающее переключение задач. Вы либо сопоставляете свои акторы с рабочими потоками ОС 1-к-1 и имеете преимущественное переключение, либо используете акторов на основе событий и совместную многозадачность.
erl_nif
делает использовать потоки ОС:
Избегайте длительной работы в вызовах NIF, так как это может ухудшить быстродействие виртуальной машины. NIF-файлы вызываются непосредственно тем же потоком планировщика, который выполнил вызывающий код Erlang. Таким образом, вызывающий планировщик будет заблокирован от выполнения любой другой работы до тех пор, пока NIF не вернется.
Таким образом, кажется, что Акка может быть лучшим вариантом для вас.