История изменений
Исправление Nervous, (текущая версия) :
Как только поток начал работать с копией, если другой поток изменил массив, та копия устарела.
Ссылочные типы данных как раз эту проблему и решают. Если два (или больше) потока одновременно делают swap! (замену значения) одному атому, успешно завершится только одна операция, а остальные будут автоматически перезапущены (и будут всегда видеть последнюю версию данных). Причём замена происходит атомарно и читатели, сделав атому deref (получить текущее значение), всегда видят консистентное значение, результат последней завершившейся на этот момент операции swap!/reset!.
Исходная версия Nervous, :
Как только поток начал работать с копией, если другой поток изменил массив, та копия устарела.
Ссылочные типы данных как раз эту проблему и решают. Если два (или больше) потока одновременно делают swap! (замену значения) одному атому, успешно завершится только одна операция, а остальные будут автоматически перезапущены (и будут всегда видеть последнюю версию данных). Причём замена происходит атомарно и читатели, сделав атому deref, всегда видят консистентное значение.