当前位置: 首页 > news >正文

烟台网站制作公司哪家好网站开发项目私活

烟台网站制作公司哪家好,网站开发项目私活,驻马店标准网站建设,爱范儿 wordpress 主题c11引入了三个智能指针,用来自动管理内存,使用智能指针可以有效地减少内存泄漏。 其中,shared_ptr是共享智能指针,可以被多次拷贝,拷贝时其内部的引用计数1,被销毁时引用计数-1,如果引用计数为…

c++11引入了三个智能指针,用来自动管理内存,使用智能指针可以有效地减少内存泄漏。

其中,shared_ptr是共享智能指针,可以被多次拷贝,拷贝时其内部的引用计数+1,被销毁时引用计数-1,如果引用计数为0,那么释放其所管理的资源

线程安全上,shared_ptr具有如下特点:

  • shared_ptr的引用计数是线程安全的
  • 修改shared_ptr不是线程安全的
  • 读写shared_ptr管理的数据不是线程安全的

具体可以参考:https://zhuanlan.zhihu.com/p/664993437

在网上找到的shared_ptr的手动实现都是线程不安全的,那么如何实现一个引用计数线程安全的shared_ptr呢?

参考:从零简单实现一个线程安全的C++共享指针(shared_ptr)-CSDN博客,本文在这篇博客的基础上增加了验证代码,并指出原有实现一个潜在的bug

#include <iostream>
#include <atomic>
#include <mutex>
#include <thread>
#include <vector>using namespace std;#define N 10000class Counter
{
public:Counter() { count = 1; }void add() {lock_guard<std::mutex> lk(mutex_);count++; }void sub() {lock_guard<std::mutex> lk(mutex_);count--;}int get() {lock_guard<std::mutex> lk(mutex_);return count; }private:int count;std::mutex mutex_;
};template <typename T>
class Sp
{
public:Sp();                           //默认构造函数~Sp();                          //析构函数Sp(T *ptr);                     //参数构造函数Sp(const Sp &obj);              //复制构造函数Sp &operator=(const Sp &obj);   //重载=T *get();                       //得到共享指针指向的类int getcount();                 //得到引用计数器
private:T *my_ptr;                      //共享指针所指向的对象Counter* counter;                   //引用计数器void clear();                   //清理函数
};//默认构造函数,参数为空,构造一个引用计数器
template<typename T>
Sp<T>::Sp()
{my_ptr = nullptr;counter = new Counter();
}//复制构造函数,新的共享指针指向旧的共享指针所指对象
template<typename T>
Sp<T>::Sp(const Sp &obj)
{//将所指对象也变为目标所指的对象my_ptr = obj.my_ptr;//获取引用计数器,使得两个共享指针用一个引用计数器counter = obj.counter;//使这个对象的引用计数器+1counter->add();	
};//重载=
template<typename T>
Sp<T> &Sp<T>::operator=(const Sp&obj)
{//清理当前所引用对象和引用计数器clear();//指向新的对象,并获取目标对象的引用计数器my_ptr = obj.my_ptr;counter = obj.counter;//引用计数器+1counter->add();//返回自己return *this;	
}//创建一个共享指针指向目标类,构造一个新的引用计数器
template<typename T>
Sp<T>::Sp(T *ptr)
{my_ptr = ptr;counter = new Counter();
}//析构函数,出作用域的时候,调用清理函数
template<typename T>
Sp<T>:: ~Sp()
{clear();
}//清理函数,调用时将引用计数器的值减1,若减为0,清理指向的对象内存区域
template<typename T>
void Sp<T>::clear()
{//引用计数器-1counter->sub();//如果引用计数器变为0,清理对象if(0 == counter->get()){// 这里有个bug,如果在此间隙处,有另外一个地方执行了share ptr的copy操作,则会crashif(my_ptr){delete my_ptr;}delete counter;}
}//当前共享指针指向的对象,被几个共享指针所引用
template<typename T>
int Sp<T>::getcount()
{return counter->get();	
};class A{
public:A(){ cout<<"A construct!"<<endl; };~A() { cout<<"A destruct!"<<endl; };
};Sp<A> sp(new A);
std::vector<Sp<A>> vec1(N);
std::vector<Sp<A>> vec2(N);Sp<A> sp1(new A);
Sp<A> sp2(new A);
Sp<A> sp3(new A);void thread_func1() {for(int i = 0; i < N; i++) {vec1[i] = sp;}
}void thread_func2() {for(int i = 0; i < N; i++) {vec2[i] = sp;}
}void test_crash_func1() {sp1 = sp2;
}void test_crash_func2() {sp3 = sp1;
}void test_crash() {for(int i = 0; i < 10 * N; i++) {std::thread t1(test_crash_func1);std::thread t2(test_crash_func2);t1.join();t2.join();}
}int main()
{std::thread t1(thread_func1);std::thread t2(thread_func2);t1.join();t2.join();std::cout<<"the count is:"<<sp.getcount()<<std::endl;test_crash();
}

按理说调用test_crash应该会导致crash才对,但是不知道为什么没有crash

TODO:使用原子操作实现,对比性能

http://www.dtcms.com/a/448708.html

相关文章:

  • 南昌淘宝网站制作公司建筑资质查询官方网站
  • 厦门市城乡建设局网站python做的网站如何部署
  • 长安公司网站设计宁波模板开发建站
  • 探索性数据分析|概念辨析
  • 江门网站建设教程做网站f12的用处
  • 免费电商网站模板我想注册一个做门窗的网站应该怎样做
  • 做淘宝客怎么建网站廊坊app网站制作
  • 长沙优秀网站建设微信网站建设app公司
  • 厦门市建设局网站首页网站制作2019趋势
  • 开源网站系统安全性网店美工的重要性
  • app开发科技网站建设搜索引擎优化的主要手段
  • 网站建设服务代理婚庆网站建设需求分析
  • 开淘宝店和做网站有什么区别湛江做网站哪家专业
  • 百度极速版app下载安装无锡seo优化公司
  • 最专业微网站多少钱推广方案万能模板
  • 织梦网站添加广告位wordpress仿模板
  • 电子商务网站主要面向潍坊个人做网站的公司
  • 宁波网站建设开发多少钱山西网站建设适合v加xtdseo
  • 做的网站怎么发布到网上试用网站要怎么做
  • 属于教育主管部门建设的专题资源网站是免费logo图标生成
  • 鼓楼徐州网站开发嘉兴建设公司网站
  • 山东省建设执业资格注册管理中心网站国外过期域名查询网站
  • 站长之家查询工具做网站引入字体
  • 做网站工作17做网站
  • 移动网站跟pc网站域名和空间有什么区别石家庄logo设计公司
  • 哪个网站做国际生意网站改版费用
  • 东莞专业微网站建设推广域名取消wordpress
  • 网站开发的具体流程宁波模板建站哪家好
  • 网站开发 前端 后端 如何结合黄页推广网站
  • 滨海县网站建设京东购物商城