为何weak_ptr::use_count与shared_ptr::use_count返回值可能不同?
实际上,单线程环境下只要weak_ptr关联的对象还存在,weak_ptr::use_count()和shared_ptr::use_count()的返回值完全一致——两者都会返回当前共享对象所有权的shared_ptr实例总数。但在以下场景中,两者可能出现数值差异:
多线程并发修改所有权计数时
use_count()的实现通常采用内存顺序宽松的加载(memory_order_relaxed),不保证跨线程的计数同步。比如线程A正在创建新的shared_ptr(增加所有权计数),同时线程B分别读取weak_ptr::use_count()和shared_ptr::use_count(),此时可能因线程调度时序问题,两个调用得到的数值不一致。对象析构的瞬时间隙
当最后一个shared_ptr被销毁时,对象会被析构,但控制块会保留到所有关联的weak_ptr都被销毁。在这个析构过程的瞬时间隙(比如计数从1降到0的过程中),不同线程读取两者的use_count()可能得到不同值——比如一个读到1,一个读到0。
注意:
use_count()仅适合用于调试或测试,绝对不能用它来判断weak_ptr是否过期(应该使用expired()),也不能依赖它的数值做生产环境的逻辑判断——因为它的返回值在多线程下是近似值。
内容的提问来源于stack exchange,提问作者cebola
相关产品推荐
相关产品推荐

