简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
1.前言
本篇目的:探讨智能指针shared_ptr死锁问题如何解决?
2.应用实例
<1>.shared_ptr死锁
#include <iostream>
#include <memory>
#include <string>
using namespace std;
int main(){
string *buf = new string("1111");
shared_ptr<string> pa(buf);
shared_ptr<string> pb(buf);
cout << "pa.use_count " << pa.use_count() << endl;
cout << "pb.use_count " << pb.use_count() << endl;
return 0;
}
使得两个shared_ptr对象托管同一个指针:
tring *buf = new string("1111");
shared_ptr<string> pa(buf);
shared_ptr<string> pb(buf);
- pa 和 pa 并不会共享同一个对buf的托管计数,而是各自将对buf的托管计数都记为 1(pb无法知道 buf已经被 pa 托管过)。
当pa消亡时要析构buf,pb消亡时要再次析构buf,这会导致程序崩溃。
<2>.shared_ptr解锁
#include <iostream>
#include <memory>
#include <string>
using namespace std;
int main(){
string *buf1 = new string("1111");
string *buf2 = new string("2222");
shared_ptr<string> pa(buf1);
shared_ptr<string> pb(buf2);
pa = pb;
cout << "pa.use_count " << pa.use_count() << endl;
cout << "pb.use_count " << pb.use_count() << endl;
return 0;
}
<3>.两个类相互引用对方shared_ptr造成死锁
#include <iostream>
#include <memory>
#include <string>
using namespace std;
class Test2;
class Test1{
public:
shared_ptr<Test2> pb_;
~Test1(){
cout << "Test1 delete\n";
}
};
class Test2{
public:
shared_ptr<Test1> pa_;
~Test2(){
cout << "Test2 delete\n";
}
};
void test() {
//v1.0
// shared_ptr<Test2> pb(new Test2());
// shared_ptr<Test1> pa(new Test1());
// pb->pa_ = pa;
// pa->pb_ = pb;
//v2.0
shared_ptr<Test1> pa = make_shared<Test1>();
shared_ptr<Test2> pb = make_shared<Test2>();
pb->pa_ = pa;
pa->pb_ = pb;
//由于share_ptr是共享资源,所以pb所指向的资源的引用计数也会加1
cout << "pb.use_count " << pb.use_count() << endl;//2
cout << "pa.use_count " << pa.use_count() << endl;//2
}//程序结束时,没有调用Test1和Test2的析构函数
int main(){
test();
return 0;
}
<4>.两个类使用weak_ptr解锁
1.weak_ptr是用于解决shared_ptr相互引用时产生死锁问题的智能指针。
2.两个shared_ptr相互引用,这两个shared_ptr指针的引用计数永远不会下降为0,资源永远不会释放。
3.weak_ptr是对对象的一种弱引用,它不会增加对象的use_count,weak_ptr和shared_ptr可以相互转化,
4.shared_ptr可以直接赋值给weak_ptr,weak_ptr也可以通过调用lock函数来获得shared_ptr。
5.将一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数。
6.指向对象的shared_ptr被销毁、释放。weak_ptr指向对象也会被释放。
#include <iostream>
#include <memory>
#include <string>
using namespace std;
class Test2;
class Test1{
public:
//shared_ptr<Test2> pb_;
weak_ptr<Test2> pb_;
~Test1(){
cout << "Test1 delete\n";
}
};
class Test2{
public:
shared_ptr<Test1> pa_;
~Test2(){
cout << "Test2 delete\n";
}
};
void test() {
//v1.0
// shared_ptr<Test2> pb(new Test2());
// shared_ptr<Test1> pa(new Test1());
// pb->pa_ = pa;
// pa->pb_ = pb;
//v2.0
shared_ptr<Test1> pa = make_shared<Test1>();
shared_ptr<Test2> pb = make_shared<Test2>();
pb->pa_ = pa;
pa->pb_ = pb;
cout << "pb.use_count " << pb.use_count() << endl;//2
cout << "pa.use_count " << pa.use_count() << endl;//2
}
int main(){
test();
return 0;
}
将shared_ptr改为weak_ptr弱智能指针。