LINUX.ORG.RU

Atomic CAS (Compare And Swap) для битов

 , ,


1

2

Интересно, существует ли такой? Хочется сделать большую битовую карту. И выставлять/проверять статус «занятости» без блокировок. Вообще похоже, что можно будет обойтись обычный байтовым CAS. Нужно для реализации lockless множества чисел. Прогамма работает с сообщениями, если уже сейчас обрабатывается сообщение связанное с пользователем (точнее с IP), и приходит еще одно, то новое должно быть отложено пка не завершится обработка предидущего. Таких обработчиков ограниченое количество - 100-200, обычно 16. Нужна структура, где хранить те IP которые в обработке.

★★★

Последнее исправление: vromanov (всего исправлений: 1)

открываем даташит для процессора целевой архитектуры, смотрим, есть ли такая команда в наборе инструкций

Harald ★★★★★
()
Ответ на: комментарий от Harald

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

vromanov ★★★
() автор топика
Ответ на: комментарий от anonymous

полностью согласен с вами, коллега

он весь development загадил своими блокировочными страданиями

anonymous
()

Вот такое получилось. Устанавливает бит в нужное значение. Возвращает 1, если значение бита было успешно изменено. Предпологается, что старое значение должно быть противоположено, тому в какое устанавливаем

uint8_t ll_bit_compare_and_swap(uint8_t* b, uint8_t bit_number, uint8_t value) {
    uint8_t mask = s_mask[bit_number];
    uint8_t x_mask = ~mask;
    uint8_t new_bit_value = ((value) ? mask : 0);
    while (1) {
        uint8_t v = *b;
        if ((v & mask) == new_bit_value) {
            return 0;
        }
        uint8_t new_v = v;
        if (value) {
            new_v |= mask;
        } else {
            new_v &= x_mask;           
        }
        if (__sync_bool_compare_and_swap(b, v, new_v)) {
            return 1;
        }
    }
    return 0;
}

vromanov ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.