的线程安全性是一个在 C++ 面试和实际开发中非常经典且容易产生误解的问题。 简单来说: 的引用计数是线程安全的,但 对象本身的读写不是线程安全的,它所指向的对象的读写也不是线程安全的。 为了彻底理解,我们需要把它的线程安全性拆解为三个独立的层面来看: 1. 引用计数(控制块)的线程安全性:绝对安全 在底层由两部分组成:指向对象的指针,以及指向控制块(Control Block)的指针。控制块中包含了强引用计数和弱引用计数。 行为: 标准库保证了对控制块中引用计数的增加(如拷贝 )和减少(如 析构)都是原子操作(Atomic)。 结论: 多个线程可以安全地各自拥有指向同一个底层对象的不同的 实例。如果多个线程同时销毁它们各自的 ,引用计数的递减是安全的,且对象只会恰好被销毁一次。 2. 对象本身的线程安全性:不安全(存在数据竞争) 标准库中对 实例的线程安全级别,等同于对普通内置类型(如 或裸指针)的线程安全级别:多读安全,读写、多写不安全。 行为: 内部通常包含两个裸指针(一个指对象,一个指控制块)。当你修改一个 时(比如给它赋新值),这两个指针都需要被修改。这不是一个原子操作...