1. C++ / Говнокод #27421

    0

    1. 1
    2. 2
    3. 3
    Нужно реализовать thread-safe set.
    На сколько нормально разбить сет на N бакетов (по хешу, условно, 10000 штук),
    тогда при добавлении или удалении элемента делать лок соответствующего бакета

    Но будет хуево, когда пойдут запросы по одному ключу в нескольких тредах.
    Есть решение лучше?

    Запостил: 3_dar, 12 Мая 2021

    Комментарии (9) RSS

    • > по одному ключу в нескольких тредах

      Ну это уже неизлечимая проблема, как мне кажется, если они реально к одному ключу лезут... По крайней мере большую часть пересечений ты таким разбиением убрал.

      З.Ы. В джаве вроде такая реализация и есть.
      Ответить
      • можно сделать в каждом треде свой кеш, и обновлять его когда обнавляется значение

        если ты пишешь раз в год, а читаешь раз в ms, то будет хорошо
        Ответить
        • > если ты пишешь раз в год...

          ... то можно вообще не париться и юзать иммутабельные структуры. Один атомик на чтение корня и дальше вообще насрать на конкуренцию.
          Ответить
    • Делай ня lock-free деревьях, будь девочкой-волшебняцей!
      https://github.com/zhangshun97/Lock-free-Red-black-tree
      Ответить
      • Был в сети анализ количества поправок в статьи по lock-free структурам данных, и из него следовало, что даже учёные - в воде мочёные постоянно обсираются в своём псевдокоде.
        Ответить
        • Надо было формально доказывать свои lock-free структуры, чтоб не обсираться.
          Ответить
        • > поправок в статьи

          Ага, там по-моему 99% статей про локфри в духе "они вот тут обосрались, но мы пофиксим это вот так"...

          Я даже не знаю, в итоге есть какая-нибудь формально корректная реализация?
          Ответить
    • а ты будешь чаще писать или читать?

      позырь тут
      https://www.baeldung.com/lock-free-programming


      https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html
      Ответить

    Добавить комментарий