Почему упорядоченные 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 »к объявлениям
всех вариантов функций начала и конца и
объявления размера, max_size и пусто.

Но почему нет 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?

3

Решение

Тот 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 объекты,
в зависимости от соответствующей функции. — конец примечания]

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]