Can I ignore thread safety when programming in Erlang?

I've just started learning about thread safety. This is making me code a lot more defensively, perhaps too defensively.

Would using a functional language like Erlang completely rid me of this concern?

6
задан Aillyn 19 August 2010 в 16:45
поделиться

4 ответа

В Erlang единицей состояния выполнения является не поток, а процесс. Да, это облегченный вид процесса, реализованный поверх потоков; но он больше похож на процесс, чем на поток.

Основной момент в том, что процессы не делятся состоянием, они передают сообщения; в то время как потоки делятся всем по умолчанию, и им приходится арбитражить, чтобы избежать хаоса.

Таким образом, вам не нужна безопасность потоков, поскольку вы не работаете с потоками.

17
ответ дан 8 December 2019 в 03:38
поделиться

Хавьер прав.

Однако я хотел бы просто добавить кое-что, поскольку это уже попадалось мне раньше. Если вы работаете со встроенным драйвером или nif, он может быть уже не потокобезопасным. Это кажется очевидным, поскольку драйвер или nif будет использовать код на C или C++, но это стоит упомянуть. Поэтому нельзя полностью игнорировать безопасность потоков только потому, что вы используете Erlang.

5
ответ дан 8 December 2019 в 03:38
поделиться

Отказ от ответственности: я практически не знаю Erlang. Отнеситесь к моему мнению с недоверием.

Чисто функциональный язык, который (очевидно) допускает только «чистые» функции. Wiki говорит, что чистые функции всегда ориентированы на многопотоковое исполнение, что подтверждает мое чутье на эту тему.

Но я не знаю, является ли Erlang чисто функциональным (wiki подразумевает обратное, так что я полагаю, что это не так). Возможно, он использует другие средства обеспечения безопасности потоков. В любом случае, его структуры данных (в основном «исключительно») неизменяемы и, таким образом, по своей сути являются потокобезопасными. И, будучи функциональным языком, по крайней мере идиоматический код Erlang не будет использовать (muc? Any?) Глобальные переменные, а вместо этого будет использовать чистые функции. Это потокобезопасные. Но ввод-вывод вещей все еще может быть проблемой ... если программа на Erlang одновременно читает и записывает файл, такой код вряд ли будет поточно-ориентированным. Но в большинстве случаев все будет в порядке благодаря неизменяемым структурам данных и тому подобному.

1
ответ дан 8 December 2019 в 03:38
поделиться

Нет. См. Актеры стиля Erlang - все о блокировке . Обеспечить потокобезопасность на функциональном языке намного проще, но об этом нужно подумать.

Я только начал изучать безопасность потоков. Это заставляет меня кодировать гораздо более оборонительно, возможно, слишком оборонительно.

Обратите внимание, что в этом случае, скорее всего, вы все еще ошибаетесь. Параллелизм с общим доступом очень и очень трудно реализовать ни в чем, кроме самых тривиальных примеров.

3
ответ дан 8 December 2019 в 03:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: