我们的产品中有一段代码,它使用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完成后开始 .

第一个'插入'成功 . 'find'找不到键,第二个'insert'也成功 . 最终,对键的“擦除”操作成功,随后的“查找”在 Map 中找到键 .

我没有这方面的复制器,但是当我的产品在重复运行某个测试时发生这种情况,比如大约6-7次 .

有关如何发生这种情况的任何想法?