C ++ ассоциативный контейнер (unordered_map) находит и вставляет один и тот же ключ одновременно из нескольких потоков - PullRequest
0 голосов
/ 07 марта 2020

Мне известны и другие подобные вопросы, касающиеся поиска и вставки одновременно, мой вопрос конкретно указывает c, чтобы найти и вставить ЖЕ КЛЮЧ одновременно.

Согласно стандарту c ++ 14 для требований к контейнерам 23.2.5 "15. Члены insert и emplace не должны влиять на действительность итераторов, если (N + n)

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

Обновление: что я действительно имею в виду, так это то, что при вставке одновременно будет считываться мусор для чтения?

1 Ответ

0 голосов
/ 06 апреля 2020

Мне потребовалось некоторое время, чтобы прочитать реализацию g cc.

  1. Если вставить одну нить, используя

    unordered_map mp; mp [key] = значение;

    при чтении одного потока с использованием: auto it = mp.find (key); // затем используем его для доступа к паре ключ-значение

    Тогда да, использование итератора, возвращаемого функцией find (), может привести к мусору, потому что это то, что произошло во время mp [key] = value:

    1. operator [] динамически создает узел, содержащий (empty_value)
    2. указатели сегмента, указывающие на вновь созданный (empty_value) узел.
    3. "=" затем введите "значение" во вновь созданный узел.

    find (ключ) может считывать мусор после шага 2 и до его завершения.

  2. Если мы используем unordered_map :: insert, тогда все будет иначе, потому что произошло следующее:

    1. Узел, содержащий (значение), создается динамически.
    2. указатель сегмента указывает на вновь созданный узел.

Таким образом, при использовании find (key) либо unordered_map не удается найти пару ключ-значение, либо пара ключ-значение имеет был полностью создан.

Это мое понимание реализации. пожалуйста, поправьте меня, если я ошибаюсь.

...