Как известно, в Экспериментальном 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?
Тот 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
объекты,
в зависимости от соответствующей функции. — конец примечания]
Других решений пока нет …