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?
В Erlang единицей состояния выполнения является не поток, а процесс. Да, это облегченный вид процесса, реализованный поверх потоков; но он больше похож на процесс, чем на поток.
Основной момент в том, что процессы не делятся состоянием, они передают сообщения; в то время как потоки делятся всем по умолчанию, и им приходится арбитражить, чтобы избежать хаоса.
Таким образом, вам не нужна безопасность потоков, поскольку вы не работаете с потоками.
Хавьер прав.
Однако я хотел бы просто добавить кое-что, поскольку это уже попадалось мне раньше. Если вы работаете со встроенным драйвером или nif, он может быть уже не потокобезопасным. Это кажется очевидным, поскольку драйвер или nif будет использовать код на C или C++, но это стоит упомянуть. Поэтому нельзя полностью игнорировать безопасность потоков только потому, что вы используете Erlang.
Отказ от ответственности: я практически не знаю Erlang. Отнеситесь к моему мнению с недоверием.
Чисто функциональный язык, который (очевидно) допускает только «чистые» функции. Wiki говорит, что чистые функции всегда ориентированы на многопотоковое исполнение, что подтверждает мое чутье на эту тему.
Но я не знаю, является ли Erlang чисто функциональным (wiki подразумевает обратное, так что я полагаю, что это не так). Возможно, он использует другие средства обеспечения безопасности потоков. В любом случае, его структуры данных (в основном «исключительно») неизменяемы и, таким образом, по своей сути являются потокобезопасными. И, будучи функциональным языком, по крайней мере идиоматический код Erlang не будет использовать (muc? Any?) Глобальные переменные, а вместо этого будет использовать чистые функции. Это потокобезопасные. Но ввод-вывод вещей все еще может быть проблемой ... если программа на Erlang одновременно читает и записывает файл, такой код вряд ли будет поточно-ориентированным. Но в большинстве случаев все будет в порядке благодаря неизменяемым структурам данных и тому подобному.
Нет. См. Актеры стиля Erlang - все о блокировке . Обеспечить потокобезопасность на функциональном языке намного проще, но об этом нужно подумать.
Я только начал изучать безопасность потоков. Это заставляет меня кодировать гораздо более оборонительно, возможно, слишком оборонительно.
Обратите внимание, что в этом случае, скорее всего, вы все еще ошибаетесь. Параллелизм с общим доступом очень и очень трудно реализовать ни в чем, кроме самых тривиальных примеров.