C++11中智能指针:shared_ptr的引用计数是线程安全的吗?

发布时间:2026/7/30 13:17:09

C++11中智能指针:shared_ptr的引用计数是线程安全的吗? 先说结论shared_ptr的引用计数是线程安全的但shared_ptr管理的对象本身不是线程安全的。一、为什么引用计数是线程安全的shared_ptr内部有一个控制块control block多个shared_ptr指向同一个对象时std::shared_ptrint p1(new int(10)); std::shared_ptrint p2p1; 此时控制块内的ref_conut2如果多个线程同时拷贝/销毁shared_ptr为了避免竞态条件标准库中使用原子操作std::atomiclong所以引用计数的增加和减少是线程安全的。二、为什么对象本身不是线程安全的假设std::shared_ptrint p(new int(0)); (*p); //两个线程都进行此操作两个线程同时修改同一个对象shared_ptr并没有加锁会产生数据竞争吧因此对象访问需要自己加锁。例如//线程函数内加锁后再访问对象 std::mutex mx; std::lock_guardstd::mutex lock(mx); (*p);三、还有一个最大的误区很多人学的比较浅的时候会误认为shared_ptr本身完全线程安全其实线程安全的是多个shared_ptr指向同一个对象因为有原子操作嘛例如std::shared_ptrint p make_sharedint(10); thread1: auto p1p; thread2: auto p2p;但如果是多个线程同时修改一个shared_ptr对象时就需要同步机制啦

相关新闻