Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Список в целом у нас должен быть как-то отсортирован, иначе непонятно, как вставлять новый элемент (это относится только к конкурентным map'ам).Можно просто при вставке идти по списку в поисках ключа, если дошли до конца списка, присоединяем последнюю запить КАСом нулевой ссылки в предыдущей последней записи. Если уже не null, идем дальше.
< (меньше)? Типа(1 << MSB(h1 ^ h2)) & h2struct less {
bool operator()( size_t h1, size_t h2) const
{
return ((1 << MSB(h1 ^ h2)) & h2 ) != 0;
}
};
tmp1 := MSB( h1 ^ h2 ) — дает номер старшего бита, в котором h1 и h2 различаются. tmp2 := 1 << tmp1 — дает число с этим единственным битом = 1. Надеюсь, endianness не влияет на сдвиги.tmp3 := tmp2 & h2 — тестируем, у кого выставлен этот бит. Если у h2, то tmp3 != 0, то есть h2 > h1 и less() возвратит true. Если не у h2 (значит, у h1), то tmp3 == 0 и less() возвратит false.h1 == h2: MSB тогда не определена, и предикат less должен выглядеть так:return h1 != h2 && ((1 << MSB(h1 ^ h2)) & h2 ) != 0;
Lock-free структуры данных. Concurrent maps: rehash, no rebuild