unordered_map 中读写锁下多线程存在潜在的core 问题
问题摘自:(优秀C++ 记录问题库,持续维护)
https://github.com/yeshenyong/Wiki_Wiki/blob/master/C%2B%2B/C%2B%2B%20%E9%81%87%E5%88%B0%E9%97%AE%E9%A2%98/C%2B%2B%20%E9%97%AE%E9%A2%98%EF%BC%9A2022-7-15.md
例子:
场景:
用
unordered_map
记录不同国家篮球联赛中,不同球队的胜场
如CBA 广东宏远队赢了48场,则表示为
_ball["CBA"]["广东宏远"] = 48
如NBA 洛杉矶湖人队赢了49场,则表示为
_ball["NBA"]["洛杉矶湖人"] = 49
但由于
_ball
这个
unordered_map
变量是受多线程访问的,则通过读写锁来保护这个临界区
class Basketball {
public:
static Basketball* getInstance() {
if (!basket) {
basket = new Basketball();
}
return basket;
}
void update(string country, string team, int32_t victory) {
ScopeWriteLock(_mutex);
_ball[country][team] = victory;
}
int visited(string country, string team) {
ScopeReadLock(_mutex);
// 错误写法, 踩坑
return _ball[country][team];
// 原因:
// 1. 如果 _ball 变量此时的country 或者 team 不存在,
// 就像_ball 变量一开始没有记录日本的篮球联赛战绩, 但此时
// 访问的 _ball["Japan"][team], 就算不存在该值, 也会
// 对 _ball 变量写入一个空值并返回, 这就涉及到了写操作了, 所以程序就可能会core
// 正确写法(如果有更好的可以评论区提), 保证整个过程没有写操作
if (_ball.find(country) == _ball.end()) return -1;
if (_ball[country].find(team) == _ball[country].end()) return -1;
return _ball[country][team];
}
private:
Basketball() {}
ScopeLock _mutex; // 读写锁共享得到mutex 锁
unordered_map<string, unordered_map<string, uint32_t>> _ball;
static Basketball* basket;
};
版权声明:本文为weixin_44974875原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。