std::shared_ptr<int>p=std::make_shared<int>(0);voidmodify_memory(){for(inti=0;i<10000;i++){(*p)++;}}std::threadt1(modify_memory);std::threadt2(modify_memory);t1.join();t2.join();std::cout<<"Final value of p: "<<*p<<std::endl;// possible result: 16171, not 20000 3....
情况一:多线程代码操作的是同一个shared_ptr的对象 比如std::thread的回调函数,是一个lambda表达式,其中引用捕获了一个shared_ptr对象 std::threadtd([&sp1](){...}); 又或者通过回调函数的参数传入的shared_ptr对象,参数类型是指针或引用类型: 指针: voidfn(shared_ptr<A>*sp){...}...std::threadtd(...
constexprintN =10000;std::vector<std::shared_ptr<int>> sp_arr1(N);std::vector<std::shared_ptr<int>> sp_arr2(N);voidincrement_count(std::vector<std::shared_ptr<int>>& sp_arr){for(inti =0; i < N; i++) { sp_arr[i] = p; } }std::threadt1(increment_count,std::ref(sp...
std::mutex g_mutex; std::shared_ptr<int> g_instance = std::make_shared<int>(0);constexprintmaxLoop =10000;voidThreadFunc(){for(inti =0; i < maxLoop; i++) { std::shared_ptr<int> tmp = g_instance;/// 加锁std::lock_guard<std::mutex>lock(g_mutex); (*tmp)++; } cout <<...
std::shared_ptr<MyClass> local_ptr = ptr; // 写时复制 local_ptr->value = 42; } int main() { std::shared_ptr<MyClass> ptr = std::make_shared<MyClass>(); ptr->value = 10; std::thread t(update, ptr); t.join();
(shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化。根据文档(http://www.boost.org/doc/libs/release/libs/smart_ptr/shared_ptr.htm#ThreadSafety), shared_ptr 的线程安全级别和内建类型、标准库容器、std::string 一样,即: ...
首先来看一下 std::shared_ptr 的所有成员函数,只有前 3 个是 non-const 的,剩余的全是 const 的: 我们来看两个例子 例 1: 代码语言:javascript 复制 #include<iostream>#include<memory>#include<thread>#include<vector>#include<atomic>using namespace std;struct SomeType{voidDoSomething(){some_value++...
(shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化。根据文档(http://www.boost.org/doc/libs/release/libs/smart_ptr/shared_ptr.htm#ThreadSafety), shared_ptr 的线程安全级别和内建类型、标准库容器、std::string 一样,即: ...
shared_ptr的定義要特別注意,他只有alloc/delete thread safe,並不保證操作thread safe std::shared_...
{int*p=newint[10];std::shared_ptr<int>sp1(p);std::shared_ptr<int>sp2(p);} 1. 2. 3. 4. 5. 它会导致两次释放同一块内存,而破坏堆。 2.多次释放:使用shared_ptr包装this指针带来的问题 classA{public:~A(){std::cout<<"~dtor\n"}std::shared_ptr<A>myGet(){returnstd::shared_ptr<A...