1智能指针shared_ptr本身(底层实现原理是引用计数)是线程安全的
智能指针的引用计数在手段上使用了atomic原子操作,只要shared_ptr在拷贝或赋值是增加引用,析构是减少引用就可以了。首先原子是线程安全的,所以智能指针在多线程下引用计数也是安全的,也就是说智能指针在多线程下传递使用时引用计数是不会有线程安全问题的。
2.智能指针指向的对象的线程安全问题,智能指针没有做任何保障
对于智能指针shared_ptr的引用计数本身是安全且无锁的,但对象的读写则不是,因为shared_ptr有两个数据成员,一个是指向的对象的指针,还有一个是引用计数管理对象。当智能指针发送拷贝时,标准库的实现是先拷贝指向对象的指针,再拷贝引用计数对象,这两个操作并不是原子操作,隐患就出现在这里。
总结
多线程读 shared_ptr 是安全的
多线程无保护读写 shared_ptr 可能出现的 race condition(竞态条件)