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