Как стать автором
Обновить

Во что вам обойдется конкурентная обработка. Иерархия проблем

Время на прочтение47 мин
Количество просмотров6K
Всего голосов 22: ↑20 и ↓2+26
Комментарии5

Комментарии 5

Если вы всё ещё не понимаете memory order, все эти seq_cst, relaxed, acquire/release, то мне помогла статья GCC Wiki AtomicSync, и вам рекомендую.

Спасибо статья хорошая.
Из плюсов - достаточно полное рассмотрение с разъяснениями и примерами (наверное претендует на славу What Every Programmer Should Know About Memory).
Из минусов - перевод (иногда только к середине абзаца понимал о какой именно известной речи идёт вещь).

ПС
Про lock convoy не знал, но видел в одном проекте хак и теперь знаю, что против него: сначала крутится спинлок (с попыткой взять атомик) и только потом уход в системный вызов.

Я вот не понимаю, когда начинают писать без введения. Ну прочитал я 3 абзаца, и что? Ничего не понял. Что такое конкурентная обработка? Конкурентные операции? Одним словом, если я не являюсь хорошим знатоком темы, то понять что-то сложно.

Я не сишник и может чего-то не понимаю, но разве cas_counter.load() не надо делать во внутреннем цикле?

std::atomic<uint64_t> cas_counter;

void cas_add(size_t iters) {
    while (iters--) {
        uint64_t v = cas_counter.load();
        while (!cas_counter.compare_exchange_weak(v, v + 1))
            ;
    }
}

Что-то типа такого:

std::atomic<uint64_t> cas_counter;

void cas_add(size_t iters) {
    while (iters--) {
        uint64_t v = cas_counter.load();
        while (!cas_counter.compare_exchange_weak(v, v + 1))
            v = cas_counter.load();
    }
}

Интересная тема, спасибо за статью. Только без оглавления ориентироваться трудновато, и переведённые устоявшиеся термины несколько сбивают с толку (приходится мысленно переводить обратно на английский).

Если кому-то интересно, как хорошо на практике реализовать "гибридную" блокировку - можно посмотреть на реализацию в аллокаторе памяти в Chromium: https://source.chromium.org/chromium/chromium/src/+/main:base/allocator/partition_allocator/spinning_mutex.h. Этот аллокатор долго меряли на множестве метрик и платформ и "шлифовали", перед тем как включить его в продакшене.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории