2010-08-19 1 views
6

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

Будет ли использование функционального языка, такого как Erlang, полностью избавить меня от этой проблемы?

ответ

17

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

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

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

+0

+1 точно вправо –

+2

Но вам нужна «безопасность процесса» :) –

1

Отказ от ответственности: Я практически не знаю Эрланг. Примите мое мнение с солью.

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

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

5

Хавьер - это право.

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

3

No. См. Erlang Style Actors Are All About Locking. Гораздо проще добиться безопасности потоков на функциональном языке, но вам нужно подумать об этом.

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

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

+0

Интересная статья, но я не думаю, что «поточно-безопасный» означает «мертвый замок». В Java/C# мир обычно означает, что объект защищен от параллельных обновлений и может безопасно использоваться в многопоточной среде. Ссылка OP на защитное программирование предполагает ту же перспективу. – dsmith

+2

Но вы правы. Новые программисты Erlang не могут игнорировать возможность блокировки. Но интересная вещь в статье заключается в том, что она ускользает от способа «разбить» мертвую блокировку, не останавливая виртуальную машину. Вы открываете оболочку Erlang и нажимаете сообщение на заблокированный процесс. – dsmith

2

Нет, вам все равно нужно учитывать безопасность потоков в Erlang, но проблемы намного проще решить.

Я читал an article, в котором автор указал, что ваш API сообщений может вызывать проблемы с потоками. Пример вращался вокруг банковского счета. Его исходный API сообщений имел операции GET и SET. Некоторый код, который хотел внести $ 100, должен ПОЛУЧИТЬ текущее значение, добавить к нему 100 и затем установить результат. Конечно, это работает только в том случае, если один процесс имеет доступ к банковскому счету. Когда два процесса управляют балансом, все ставки отключены.

Его решение состояло в том, чтобы изменить API сообщений на DEPOSIT и WITHDRAW (он фактически использует одно сообщение - ОБНОВЛЕНИЕ - но вы получаете идею). Это заставляет взаимодействие воспринимать атомную семантику - процесс прослушивания будет обрабатывать только один депозит или изъятие за раз и блокирует другие запросы до тех пор, пока первое не будет завершено.

Стоит отметить, что эта проблема по существу такая же, как проблема с общей памятью. (Если мы используем сообщения GET и SET для взаимодействия с процессом, мы по существу создали некоторую общую память). Еще один блоггер compares ets to shared memory. Однако, до тех пор, пока вы понимаете, где вы вводите конструкции с общей памятью и регулируете доступ к этой общей памяти, вы не должны иметь проблем с потоками (за исключением взаимоблокировки, конечно).

Смежные вопросы