unordered_map 在读写锁下多线程潜在的core 问题

  • Post author:
  • Post category:其他



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 版权协议,转载请附上原文出处链接和本声明。