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

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;
};
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值