我们的产品中有一段代码,它使用std :: map来存储数据,其关键是boost :: make_tuple(std :: string,std :: string)。在调试问题时,我发现在映射中插入键值对后,在映射中找到该键导致为负,并且另一次尝试插入键值1对成功。
这说明了操作顺序:
Flow A:
Key k = boost::make_tuple(str1, str2);
bool added = temp_map_.insert(std::make_pair(k, val)).second;
Flow B:
TempMap::iterator itr = temp_map_.find(k);
if (itr == temp_map_.end()) {
Key k = boost::make_tuple(str1, str2);
bool added = temp_map_.insert(std::make_pair(k, val1)).second;
}
请注意,流程A在流程A完成后开始。
第一个'插入'成功。 '发现'找不到密钥,第二个'插入'也成功了。最终,'擦除'对密钥的操作成功,随后发现'在地图中找到关键字。
我没有这方面的复制品,但是当我的产品在重复运行某个测试时发生这种情况,比如大约6-7次。
关于如何发生这种情况的任何想法?