Нужна помощь в понимании проблемы "ABA" - PullRequest
2 голосов
/ 09 декабря 2010

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

http://fara.cs.uni -potsdam.de / ~ jsg / nucleus / index.php? Itemid = 6

В ней говорится: пока фактическое значениеhead_ то же самое (а) указатель next_ НЕ

Но как это может быть?Если два структурных объекта

struct node {
   node *next;
   data_type data;
};

"head_" и "current" указывают на одну и ту же область в памяти, как может head _-> next и current-> next указать на другую?

Itтакже говорит: последняя операция, сравнивать и менять foo, УСПЕШНО, когда это не должно.

Тогда что он должен делать?Загрузить тот же адрес и попробовать еще раз?В чем разница?

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

deleted.compare_exchange_strong(head, 0);

но если измененный объект хорошо инициализирован и его следующий указатель содержит указатель на инициализированный объект, то в чем проблема?

Заранее спасибо.

1 Ответ

6 голосов
/ 09 декабря 2010

"head_" и "current" указывают на одну и ту же область в памяти, как могут head _-> next и current-> next указывать на другую точку?

Нет;но в коде необходимо, чтобы и head, и head->next были стабильными во время выполнения метода pop - но CAS обеспечивает это только для head.Он молча предполагает, что head->next не изменится без изменения head, что неверно.Таким образом, он читает что-то как current->next, и через некоторое время он меняется.

В нем также говорится: последняя операция, сравнивать и менять foo, УСПЕШНО, когда это не должно.

Тогда что он должен делать?Загрузить тот же адрес и попробовать еще раз?В чем разница?

Да.Метод должен ждать (или продолжать пытаться), пока никто не испортит структуру под его руками.

, но если измененный объект хорошо инициализирован и его следующий указатель содержит указатель на инициализированный объект, то в чем проблема??

Может быть что угодно.Нарушения инвариантов классов, двойные освобождения / утечки памяти, потери данных и т. Д.

...