为什么b站会有一次播放10点赞:“Sloppy” counterWhy a Bilibili video shows one view and ten likes: the “sloppy” counter

听了jyy讲并发数据结构,终于知道为啥b站有时候会有一播放10点赞的情况 具体的代码实现:

int sum_local[MAX_TID];

void T_sum(int tid) {
    if (++sum_local[tid] == 100) {
        mutex_lock(&lk);

        sum += sum_local[tid];  // "Sloppy" counter

        mutex_unlock(&lk);
        sum_local[tid] = 0;
    }
}

在高并发系统里,每个线程或服务器分片通常不会每来一次请求就立刻修改共享的全局计数器,而是先把事件记录在自己的本地计数器 sum_local[tid] 中,累计到一定数量后再一次性汇总到全局的 sum; 也和 CPU 缓存有关:不同线程更新各自的本地计数器时,数据可以主要存在对应核心的私有 L1/L2 缓存中,避免多个核心频繁争抢同一个共享变量;而全局 sum 需要通过互斥锁和缓存一致性机制同步,更新成本更高,所以才采用批量汇总,代价是全局显示值会暂时落后于真实发生的事件。