В чём смысл Interlocked.CompareExchange?
В документации есть метод: System.Threading.Interlocked.CompareExchange
Ссылка: https://docs.microsoft.com/ru-ru/dotnet/api/system.threading.interlocked.compareexchange?view=netcore-3.1
Судя по описанию - он выполняет сравнение с использованием механизма ссылок, вопрос зачем?
Скорее всего я понял не правильно, что в результате сравнения он подменяет ссылку.
Это такая хитрая система экономии ресурсов?
Если это не так - то что делает данный метод и зачем?
И вообще при чём здесь потоки?
Ответы (2 шт):
Смысл CompareExchange в том, что комплекс операций сравнения и замены выполняется атомарно, другие потоки не могут вклиниться в этот процесс.
Дело в том, что при использовании последовательности операторов
if (a==b)
a = c;
в многопоточном окружении между сравнением и заменой другой поток может модифицировать значения a, b или c, и результат будет непредсказуем.
Сравнение с обменом - атомарная операция, используемая для реализации неблокирующих (lock-free) алгоритмов.
Такие алгоритмы во многих случаях (не всегда!) оказываются предпочтительней, чем реализации с блокировками.
Некоторые потокобезопасные коллекции в современном дотнете используют внутри себя такие операции.