Ejemplo n.º 1
0
void Deque::pushRight (
    void* thing
    )
{
    // We want to insert at right_index
    int index_in_slab = right_index_ - index_table_[rightmost_slab_];
    slab_table_[rightmost_slab_]->data_array_[index_in_slab] = thing;

    // Increment index
    right_index_++;

    expandIfNeeded();

    if (right_index_ >= currentRightSlabRightBound()) {
        rightEndHopRight();
    }
}
Ejemplo n.º 2
0
void Deque::pushLeft (
    void* thing
    )
{
    // We want to insert at left_index - 1
    left_index_--;

    if (left_index_ < currentLeftSlabLeftBound()) {
        leftEndHopLeft();
    }

    Slab* current_left_slab = slab_table_[leftmost_slab_];
    int index_in_slab = left_index_ - index_table_[leftmost_slab_];
    current_left_slab->data_array_[index_in_slab] = thing;

    expandIfNeeded();
}
void ThreadSafeHashSet<T, H>::insert(const T& element) {
    // Проверка нужна поскольку это множество. Иначе уже multiset.
    if (contains(element)) {
        return;
    }
    // Расширяет таблицу, если нужно. Описание в заголовке.
    expandIfNeeded();
    // Нужная корзина - в которую попадёт элемент.
    unsigned int neededBucket = getHash(element) % getCurrentBucketsNumber();
    // Мьютекс, который придется заблокировать.
    unsigned int neededMutex = neededBucket % mutexNumber_;
    // Блокируем этот мьютекс.
    stripesLocks_[neededMutex].writeLock();
    buckets_[neededBucket].push_front(element);
    stripesLocks_[neededMutex].writeUnlock();
    // Это блок на атомарную инкрементацию / декрементацию счётчика элементов в таблице.
    std::unique_lock<std::mutex> incrementingLock(elementsCounterLock_);
    // Мы добавили элемент, проинкрементируем счётчик.
    currentElementsNumber_++;
    // Insertion done.
}