3

众所周知,Experimental C++ 中有事务内存 TS(ISO/IEC TS 19841:2015):将函数声明为 transaction_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 类模板图[map]

23.4.4.1 类模板地图概述[map.overview]

在 23.4.4.1 [map.overview] 中,将“transaction_safe”添加到 begin 和 end 成员函数的所有变体的声明以及 size、max_size 和 empty 的声明中。

但是为什么没有operator[]声明transaction_safestd::mapand std::set(但有 for unordered_map/ unordered_set)?

为什么要在 and 的所有变体beginend成员函数的声明std::map中添加“transaction_safe” std::set

迭代器begin和对于, orend是非常必要的,但对于关联数组则不是。在关联数组中需要查找或查找并修改函数:、、和。没有他们,这是没有意义的。std::arraystd::vectorstd::listfindatinserteraseoperator[]

为什么没有邀请订购 std::map 和订购 std::set 来制作 transaction_safe?

4

1 回答 1

2

unordered_meow::operator[]指定为无条件事务安全是一个缺陷。

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

相反,map::operator[]的事务安全性由添加到 [container.requirements.general] 的内容管理:

除非无条件地指定为事务安全,否则如果所有必需的操作都是事务安全的,则本条款中的函数是事务安全的。[ 注意:这包括对元素类型、 onstd::allocator_traits和 on ComparePredHash对象的操作,具体取决于各自的功能。——尾注]

于 2016-08-03T21:23:03.057 回答