众所周知,实验C ++中有Transactional Memory TS(ISO / IEC TS 19841:2015):Is it enough to declare a function as transaction_safe, so they can be used thread-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关联容器[associative]
23.4.4班级模板地图[地图]
23.4.4.1班级模板地图概述[map.overview]
在23.4.4.1 [map.overview]中,将“transaction_safe”添加到声明中 开头和结尾成员函数的所有变体和 size,max_size和empty的声明。
但为什么operator[]
和transaction_safe
std::map
被std::set
声明为unordered_map
(unordered_set
/ begin
?
为什么在end
和std::map
的{{1}}和std::set
成员函数的所有变体的声明中添加“transaction_safe”?
对于begin
,end
或std::array
,迭代器std::vector
和std::list
非常必要,但对于关联数组则不是。在关联数组中,需要查找或查找和修改函数:find
,at
,insert
,erase
和operator[]
。没有它们,它没有意义。
为什么命令std :: map和ordered std :: set不被邀请进行transaction_safe?
答案 0 :(得分:2)
指定AuthCredential
无条件交易安全是一个缺陷。
unordered_meow::operator[]
,unordered_set
和unordered_multiset
一开始就没有unordered_multimap
。operator[]
必须调用unordered_map::operator[]
和Hash
,并可能分配内存并构造新的键值对;这些都不一定是交易安全的。相反,Pred
的交易安全性受[container.requirements.general]的加法控制:
除非无条件地指定为事务安全,否则为函数 如果所有必需的操作都是,则本条款是交易安全的 交易安全。 [注意:这包括对元素的操作 类型,
map::operator[]
以及std::allocator_traits
,Compare
或Pred
个对象, 取决于各自的功能。 - 结束说明]