为什么命令std :: map和ordered std :: set不被邀请进行transaction_safe?

时间:2016-08-03 15:00:09

标签: c++ concurrency stl c++14 transactional-memory

众所周知,实验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_safestd::vectorstd::unordered_mapstd::unordered_multimapstd::unordered_setstd::unordered_multisetstd::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::mapstd::set声明为unordered_mapunordered_set / begin

为什么在endstd::map的{​​{1}}和std::set成员函数的所有变体的声明中添加“transaction_safe”?

对于beginendstd::array,迭代器std::vectorstd::list非常必要,但对于关联数组则不是。在关联数组中,需要查找或查找和修改函数:findatinserteraseoperator[]。没有它们,它没有意义。

为什么命令std :: map和ordered std :: set不被邀请进行transaction_safe?

1 个答案:

答案 0 :(得分:2)

指定AuthCredential无条件交易安全是一个缺陷。

  • 首先,unordered_meow::operator[]unordered_setunordered_multiset一开始就没有unordered_multimap
  • operator[]必须调用unordered_map::operator[]Hash,并可能分配内存并构造新的键值对;这些都不一定是交易安全的。

相反,Pred的交易安全性受[container.requirements.general]的加法控制:

  

除非无条件地指定为事务安全,否则为函数   如果所有必需的操作都是,则本条款是交易安全的   交易安全。 [注意:这包括对元素的操作   类型,map::operator[]以及std::allocator_traitsComparePred个对象,   取决于各自的功能。 - 结束说明]