NIF, чтобы обернуть мой многопоточный код C++
У меня есть код C++, который реализует специальный протокол через последовательный порт. Код является многопоточным и внутренне опрашивает последовательный порт и выполняет собственную циклическую обработку. Я хотел бы вызвать этот драйвер из erlang, а также получать события от этого драйвера. Меня беспокоит то, что этот код C++ является многопоточным, а также полностью состоящим, что означает, что когда я вызываю определенную функцию в драйвере, он кэширует внутри себя вещи, которые будут использоваться / требуются при последующих вызовах драйвера. Мои вопросы
1. Работает ли NIF в том же процессе ОС, что и остальная часть моего процесса erlang, или NIF запускается в отдельном процессе ОС?
2. Имеет ли смысл деформировать этот многопоточный код C++ с сохранением состояния с помощью NIF?
4.Если NIF не является правильным подходом, то для меня это лучший способ заставить Элранга разговаривать взад и вперед с этим кодом C++. Я также предпочитаю, чтобы мой код C++ находился внутри того же процесса ОС, что и остальные мои процессы Erlang, и, похоже, что связанные драйверы являются опцией, но я не уверен, что многопоточная природа моего кода C++ подойдет для этого. модель. Плюс я слышал, они могут испортить планировщик элранга?
1 ответ
В отличие от портов, NIF запускаются в процессе Erlang VM, аналогично драйверам. Из-за этого любые сбои NIF также приведут к остановке виртуальной машины. И, отвечая заранее, на ваш последний вопрос, NIF, как и драйверы, могут блокировать ваш планировщик.
Это зависит от функциональности, которую вы реализуете с помощью этого кода C++. Из-за ответа 1) вы, вероятно, захотите избежать параллелизма в части C++, так как это потенциальный источник ошибок. Это не всегда возможно, конечно. Но если вы реализуете, скажем, пул некоторых рабочих, продолжайте внедрять однопоточный код, создавая его столько раз, сколько вам нужно.
Драйверы также могут быть многопоточными, с такими же потенциальными проблемами и довольно схожей производительностью (ну, все же, немного быстрее, чем NIF). Если вы не совсем уверены в стабильности своего кода C++, используйте его в качестве порта Erlang.
Говоря о разнице между NIF и драйверами, первый изначально является синхронным, а второй может быть асинхронным (что может быть огромным преимуществом, если вы не хотите получать ответы на большинство команд). Драйверы легче запутать и сложнее реализовать (но как только вы поймете основные закономерности и проблемы, на самом деле все будет в порядке).
Вот хорошее начало для водителей: http://www.erlang.org/doc/apps/erts/driver.html
И что-то похожее (вот разница в сложности) для NIF: http://www.erlang.org/doc/tutorial/nif.html