这章比较简单简短,主要介绍了并发数据结构的实现。
总结下的话,实现并发的数据结构,我们需要考虑主要2个点:
- 正确性。这个毋庸置疑,并发情况操作下,要保证数据的正确性。
- 性能。并发数据结构的性能其实分两部分
- 在实现正确性的情况下,结构本身的性能
- 在线程越来越多(并发越来越高)的情况下,性能下降的程度
从这些点来考虑的话,我们直接总结下这章说道的并发数据结构的实现方式:
- 直接所有操作加锁,缺点就是性能最差,适用于所有数据结构。
- 降低锁的规模,比如队列只对头尾节点加锁,哈希表只对对应的桶加锁。
这章提到了一个实现或者说概念,接近计数器Approximate Counters
接近计数器主要由以下几部分组成:
- 维护一个跟CPU相关的计数counter,thread counter。比如使用一个数组,然后通过当前线程id%cpu总数来得到对应的桶。
- 全局维护的一个计数counter,global counter。
- 一个阈值threshold。
当使用时,每个线程获取自己thread counter的锁进行操作thread counter(避免了全局锁,获取自己的锁的原因是单cpu上也可能线程切换)。
当thread counter的值达到threshold阈值以后,尝试获取global coutner的锁,将thread counter的值加到global counter上去。
我们会发现,因为threshold的存在,global counter的值总是一个接近真实值的较小值,它与准确度大小与threshold有关,同时,这个计数器的性能也与threshold有关,这两者成反比,越准确,性能越差。反之亦然。