Почему упорядоченные std::map и упорядоченные std::set не приглашены для выполнения транзакции_safe?

Как известно, в Экспериментальном C++ есть транзакционная память TS (ISO/IEC TS 19841:2015): достаточно ли объявить функцию как action_safe, чтобы их можно было использовать как поточно-ориентированные?

А также operator[] объявлен как transaction_safe только для контейнеров: std::vector, std::unordered_map, std::unordered_multimap, std::unordered_set, std::unordered_multiset, std::deque - Взято из n4514: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4514.pdf

23.4 Ассоциативные контейнеры [ассоциативные]

23.4.4 Карта шаблона класса [карта]

23.4.4.1 Обзор карты шаблона класса [map.overview]

В 23.4.4.1 [map.overview] добавьте "action_safe"к объявлениям всех вариантов функций-членов начала и конца, а также к объявлениям size, max_size и empty.

Но почему нет operator[] объявлен как transaction_safe за std::map а также std::set (но есть для unordered_map/unordered_set)?

И почему там есть добавление "action_safe"в объявлениях всех вариантов begin а также end функции-члены для std::map а также std::set?

итераторы begin а также end очень необходимы для std::array, std::vector или же std::list, но не для ассоциативного массива. В ассоциативном массиве требуются функции поиска или поиска и изменения: find, at, insert, erase а также operator[], Без них это не имеет смысла.

Почему упорядоченные std::map и упорядоченные std::set не приглашены для выполнения транзакции_safe?

1 ответ

Решение

Тот unordered_meow::operator[] определено как безусловно безопасное для транзакций, является дефектом.

  • Начать с, unordered_set, unordered_multiset а также unordered_multimap даже не имеет operator[] на первом месте.
  • unordered_map::operator[] должен позвонить Hash а также Predи, возможно, выделить память и создать новую пару ключ-значение; ни один из них не обязательно безопасен для транзакций.

Вместо, map::operator[]Безопасность транзакций регулируется добавлением к [container.requirements.general]:

Если безоговорочно не указано, что она безопасна для транзакций, функция в этом разделе является транзакционной, если все необходимые операции безопасны для транзакций. [Примечание: это включает в себя операции над типом элемента, на std::allocator_traitsи на Compare, Pred, или же Hash объекты, в зависимости от соответствующей функции. - конец примечания]

Другие вопросы по тегам