Интернет магазин китайских планшетных компьютеров



Компьютеры - Проблема ABA - Обходные решения

15 июня 2011


Оглавление:
1. Проблема ABA
2. Пример
3. Обходные решения



Обычное обходное решение — это добавить дополнительные биты «метки» в проверяемое значение. Например, алгоритм, использующий compare-and-swap над указателями может использовать младшие биты адреса для проверки, сколько раз указатель был изменён. Из-за этого следующий compare-and-swap не сработает, поскольку биты меток не совпадут. Это не решает проблему полностью, но помогает избежать её. Некоторые архитектуры предоставляют двухсловный compare-and-swap, что позволяет сделать большую метку. Обычно это называется ABA', потому что второе значение A слегка отличается от первого.

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

Другой подход — использовать один или несколько hazard pointer-ов, — указателей, которые в принципе не могут появиться в структуре данных. Каждый hazard pointer обозначает промежуточное состояние структуры в процессе изменения; наличие указателей требует дальнейшей синхронизации.

Некоторые архитектуры предоставляют «укрупнённые» атомарные операции, благодаря чему, например, можно атомарно изменять сразу обе ссылки вперёд и назад в двусвязном списке.

Некоторые архитектуры предоставляют инструкцию load linked, store conditional в которой запись в ячейку возможна, только если не было других записей в указанную ячейку. Это эффективно отделяет признаки «ячейка содержит значение» от «ячейка была изменена». Примеры архитектур — DEC Alpha и PowerPC.



Просмотров: 2535


<<< SIGXFSZ
Rundown protection >>>