C ++ 11 memory_model_relaxed и memory_order_seq_cst отношение - PullRequest
0 голосов
/ 19 мая 2019

Привет, я пытаюсь понять реализацию блокировки кражи без блокировки работы.В настоящее время я читаю одну реализацию на филаменте Google здесь .Меня больше всего беспокоит операция перехвата.

template <typename TYPE, size_t COUNT>
TYPE WorkStealingDequeue<TYPE, COUNT>::steal() noexcept {
    do {
        // mTop must be read before mBottom
        int32_t top = mTop.load(std::memory_order_seq_cst);

        // mBottom is written concurrently to the read below in pop() or push(), so
        // we need basic atomicity. Also makes sure that writes made in push()
        // (prior to mBottom update) are visible.
        int32_t bottom = mBottom.load(std::memory_order_acquire);

        if (top >= bottom) { 
            // queue is empty
            return TYPE();
        }

        // The queue isn't empty
        TYPE item(getItemAt(top));
        if (mTop.compare_exchange_strong(top, top + 1,
                std::memory_order_seq_cst,
                std::memory_order_relaxed)) {
            // success: we stole a job, just return it.
            return item;
        }
        // failure: the item we just tried to steal was pop()'ed under our feet,
        // simply discard it; nothing to do.
    } while (true);
}

Мне интересно, правильно ли заменить начальный порядок памяти mtop.load на memory_order_relaxed и последующий порядок памяти mBottom.load на memory_order_seq_cst.Это все равно должно сохранить порядок mtop.load и mBottom.load, верно?Флаг memory_order_seq_cst должен по-прежнему препятствовать переупорядочению memory_order_relaxed, чтобы пройти операцию загрузки, верно?

1 Ответ

0 голосов
/ 13 июня 2019

Вы должны рассуждать о коде с точки зрения порядка, в котором разрешено выполнять операции с памятью для поддержания корректности, а также того, как эти упорядочения влияют на межпотоковую синхронизацию. Стандарт C ++ std::memory_order позволяет программисту выражать такие ограничения и предоставляет компилятору возможность создавать необходимые ограничения памяти для реализации этих ограничений.

Код уже точно выражает, что ему нужно сделать: последовательность mTop.load() до mBottom.load() и синхронизация mBottom.store() в push() с mBottom.load() в steal().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...