Предотвращение проблемы ABA в коде .NET - PullRequest
8 голосов
/ 20 марта 2009

Обратите внимание, что я уже знаю и понимаю проблему ABA . Этот вопрос касается поведения модели памяти .NET по отношению к ABA.

В своем обсуждении стека LIFO без блокировки (колонка CLR Inside Out от журнала MSDN в мае 2007 года) Джо Даффи говорит:

«Мы выполняем распределение объектов для каждого Push, избавляя нас от необходимости беспокоиться о так называемых проблемах ABA».

Затем он очень кратко описывает проблему ABA и упоминает, что это может произойти в нативном C / C ++, поскольку распределитель памяти может повторно использовать адрес, как только он освободится.

Все хорошо. Но что делает программы .NET невосприимчивыми к проблеме ABA? Подразумевает ли он, что, поскольку узлы не могут быть повторно использованы немедленно (т. Е. Существует некоторая задержка между тем, когда узел выходит из области видимости и когда GC собирает его), нет возможности возникновения проблемы ABA? Если так, то это безопасное утверждение?

Я буду первым, кто признает, что я не знаю всех тонкостей распределителя памяти .NET или сборщика мусора, но мое ограниченное понимание заставляет меня поверить, что ссылку можно использовать повторно. , И если есть вероятность повторного использования ссылки, то не делает ли это возможным проблему ABA, если даже весьма маловероятную?

1 Ответ

6 голосов
/ 20 марта 2009

Если поток 1 имеет ссылку на объект по адресу памяти X, то по определению ничто из потока 2 не может заставить другой объект использовать этот же адрес. Объект все еще жив, и его адрес не будет использоваться повторно, пока не останется никаких ссылок на него. Это гарантирует, что - когда блокированная операция обмена вернет ожидаемое нами значение, проблема ABA не возникла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...