C++中shared_ptr的线程安全性实现是否为零开销?
首先要纠正一个误解:shared_ptr控制块的线程安全不是通过互斥锁实现的,而是依赖CPU硬件支持的原子操作。原子操作的开销远低于互斥锁,甚至在单线程场景下,大部分原子操作的开销和普通内存读写几乎没有区别,完美契合C++“不为未使用特性付费”的核心理念。
C++标准规定,shared_ptr的引用计数增减必须是原子操作,这是为了保证多线程环境下复制、销毁shared_ptr时的线程安全。但原子操作的设计本身就兼顾了单线程效率:比如在x86架构下,原子递增/递减只需要一条带
lock前缀的指令,单线程执行时几乎没有额外开销,完全不需要上下文切换这类互斥锁的高成本操作。所谓“不为未使用的特性付费”,并不是要求完全零开销,而是让不必要的特性开销尽可能小到可以忽略。shared_ptr的原子引用计数设计就满足这一点——单线程场景下的额外开销微乎其微,却换来了多线程场景下的原生安全,不需要用户自己去实现线程安全的智能指针版本,也不用在单线程和多线程场景下维护两套不同的实现。
内容的提问来源于stack exchange,提问作者k huang
相关产品推荐
相关产品推荐

