shared_ptr是线程安全的吗?对此问题,我们需要从三个并发场景进行考虑,拷贝shared_ptr的安全性、对shared_ptr赋值的安全性和读写shared_ptr指向的内存区域的安全性。
首先给出以下结论:
- 如果多个线程同时拷贝同一个shared_ptr对象,不会有问题,因为shared_ptr的引用计数是线程安全的。
- 如果多个线程同时修改同一个shared_ptr 对象,不是线程安全的。
- 如果多个线程同时读写shared_ptr指向的内存对象,不是线程安全的。
下面通过简单程序实验证明:
- 引用计数更新,线程安全
这里我们讨论对shared_ptr进行拷贝的情况,由于此操作读写的是引用计数,而引用计数的更新是原子操作,因此这种情况是线程安全的。下面这个例子,两个线程同时对同一个shared_ptr进行拷贝,引用计数的值总是20001。
#include <iostream>
#include <vector>
#include <memory>
#include <thread>
constexpr int N = 10000;
void increment_count(std::vector<std::shared_ptr<int>>& sp_arr, std::shared_ptr<int> p) {
fo