Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Lock-free удаление элемента из связанного списка

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

KivApple

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Допустим, есть однонаправленный кольцевой связанный список. Его голова хранится в head (описано как Item * volatile), указатель на следующий элемент хранится в Item::next (описано как Item * volatile). С добавлением элементов проблем не возникает, а вот с удалением есть проблема.

Код:
 
// item - элемент, который мы хотим удалить из списка
while (true) {
    Item *prev = head;
    if (prev == NULL) break;
    while (prev->next != item) { // ***
        prev = prev->next;
    }
    if (__sync_bool_compare_and_swap(&(prev->next), item, item->next)) {
        if (__sync_bool_compare_and_swap(&(head), item, item->next)) {
            __sync_bool_compare_and_swap(&(head), item, NULL);
        }
        break;
    }
}
 

Запускаю тесты - несколько потоков параллельно пытаются много раз добавлять и удалять элементы из списка (элементы одни и те же и память под них выделена заранее, просто берётся рандомный элемент из набора, который ещё не добавили/уже удалили и с ним делается противоположное действие). В результате иногда имею зависания на цикле, помеченном звёздочкой (когда количество элементов достаточно мало, но больше одного).
Как можно это устранить?
Предполагаю, что проблема возникает, когда функция удаления прерывается другим потоком, который успевает полностью заменить содержимое списка.

Всего записей: 2 | Зарегистр. 01-03-2012 | Отправлено: 21:27 04-01-2016
JFK2005



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
На всё время удаления блокировать доступ к списку мьютексом.

Всего записей: 2060 | Зарегистр. 26-10-2005 | Отправлено: 07:10 09-01-2016
landy



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Если ты хочешь именно lockfree (без блокировок), то и нужно использовать такую структуру, например, встроенный SList, который хорошо описан на хабре

Всего записей: 576 | Зарегистр. 17-01-2003 | Отправлено: 19:44 13-01-2016 | Исправлено: landy, 19:46 13-01-2016
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Lock-free удаление элемента из связанного списка


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru