Я также рассмотрю часть Haskell.
Во-первых, я хочу, чтобы очистить что-то:
Вместо того чтобы изменять значения переменных, мы создаем новые переменные в функциональном программировании, когда необходимо обновить переменную.
Это не так точно. Мы создаем новые «переменные» в FP, когда они нам нужны, а не когда нам нужно мутировать существующие. Мы даже не думаем о мутации, когда делаем то, что вы описываете; мы можем просто подумать, что мы создаем новое значение, подобное тому, которое у нас есть.
То, что вы описываете с помощью потоков, немного отличается. Вы действительно ищете побочный эффект (увеличение счетчика). Haskell, будучи чистым, не просто позволит вам бросить побочные эффекты, не будучи очень явным. Поэтому в этом случае вам нужно будет обратиться к ссылочным типам/изменяемым ячейкам.Самый простой из них называется IORef
, и он очень похож на переменную в этом смысле; вы можете присвоить значение, прочитать текущее значение и так далее.
Итак, как вы можете видеть, когда вы ищете такие вещи, у вас действительно есть только одна копия счетчика.
Вышесказанное является сущностью моего ответа, но вы конкретно задали вопросы о потоках, чтобы я ответил на это как-хорошо.
IORef
s на самом деле не являются потокобезопасными. Итак, есть MVar
s, как было предложено. Они не похожи на обычные переменные, но они близки, и они выполняют свою работу элегантно. Вообще и свободно говоря: они абстрагируют переменные и блокируют. Я думаю, вы могли бы найти TVar
s проще, хотя. Они ведут себя как IORef
/переменные, только в отличие от обоих, они потокобезопасны; вы можете составить их операции в одну операцию, и любая операция, выполняемая с ними, выполняется атомарно (STM).
Кстати, вы можете найти способы избежать состояния вообще, и это очень поощряется. Например. вы можете, чтобы два потока выполняли асинхронную рекурсивную функцию, которая запоминает через аргумент, сколько запросов было сделано, а затем имеет в качестве возвращаемого значения. Общее количество запросов - это сумма запросов, возвращаемых всеми вашими потоками. Это позволяет избежать побочного эффекта на счетчике, но это может привести только к результату, когда потоки будут завершены. Это довольно ограничено, поэтому иногда вам может понадобиться этот побочный эффект.
Нити никогда не являются целью, всегда инструментом. Вы, как правило, хотите как можно больше забыть о них, и только пусть некоторые низкоуровневые, очень хорошо продуманные машины выполняют резьбу для вас под капотом. –