【发布时间】:2016-12-09 09:17:47
【问题描述】:
众所周知,实验 C++ 中有事务性内存 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 类模板图[map]
23.4.4.1 类模板地图概述[map.overview]
在 23.4.4.1 [map.overview] 中,将“transaction_safe”添加到声明中 begin 和 end 成员函数的所有变体以及 size、max_size 和 empty 的声明。
但是为什么operator[] 没有为std::map 和std::set 声明为transaction_safe(但有unordered_map/unordered_set)?
为什么要在std::map 和std::set 的begin 和end 成员函数的所有变体的声明中添加“transaction_safe”?
迭代器 begin 和 end 对于 std::array、std::vector 或 std::list 是非常必要的,但对于关联数组则不是。在关联数组中需要查找或查找并修改函数:find、at、insert、erase 和 operator[]。没有它们,就没有意义。
为什么命令 std::map 和命令 std::set 不被邀请来使事务安全?
【问题讨论】:
-
我强烈怀疑
operator[]上unordered_meow的无条件事务安全是一个缺陷。
标签: c++ concurrency stl c++14 transactional-memory