muduo书第一章的思维导图(新窗口打开可以看大图)

线程安全的对象析构和回调(使用shared_ptr和weak_ptr)

注释是英文的(工地英语…)

StockFactory.h

// in multi-thread environment, there maybe a race condition

// an object's destruction is difficult to handle for complex cases

// a good news is that a smart pointer named "shared_ptr" provides ability to release the resources automatically

#ifndef MUDUO_STOCKFACOTRY_H

#define MUDUO_STOCKFACOTRY_H

#include "Mutex.h"

#include

#include

#include

#include

class Stock

{

public:

Stock(const std::string &key);

std::string

Key() const;

private:

std::string key_;

};

class StockFactory1 : public boost::noncopyable

{

public:

std::shared_ptr get(const std::string &key);

private:

mutable MutexLock mutex_;

std::map<:string std::shared_ptr>> stocks_;

};

class StockFactory2 : public boost::noncopyable

{

public:

std::shared_ptr get(const std::string &key);

private:

mutable MutexLock mutex_;

std::map<:string std::weak_ptr>> stocks_;

};

class StockFactory3 : public boost::noncopyable

{

public:

std::shared_ptr get(const std::string &key);

private:

mutable MutexLock mutex_;

std::map<:string std::weak_ptr>> stocks_;

void deleteStock(Stock *stock);

};

class StockFactory4 : public boost::noncopyable, std::enable_shared_from_this

{

public:

std::shared_ptr get(const std::string &key);

private:

mutable MutexLock mutex_;

std::map<:string std::weak_ptr>> stocks_;

void deleteStock(Stock *stock);

};

class StockFactory5 : public boost::noncopyable, std::enable_shared_from_this

{

public:

std::shared_ptr get(const std::string &key);

private:

mutable MutexLock mutex_;

std::map<:string std::weak_ptr>> stocks_;

static void weakDeleteCallback(const std::weak_ptr &wkFactory, Stock *stock);

void removeStock(Stock *stock);

};

#endif //MUDUO_STOCKFACOTRY_H

StockFactory.cpp

#include "StockFacotry.h"

#include "Mutex.h"

Stock::Stock(const std::string &key) : key_(key){

}

std::string Stock::Key() const

{

return key_;

}

// error, the memory managed by shared_ptr may never be released

std::shared_ptr StockFactory1::get(const std::string &key)

{

MutexLockGuard lock(mutex_);

auto pos = stocks_.find(key);

if(pos != stocks_.end())

{

return pos->second;

} else

{

stocks_[key] = std::shared_ptr(new Stock(key));

return stocks_[key];

}

}

// not that good, the map may contain to many weak_ptr entities.

// stocks_.size() equals the number of all objects including the released ones.

std::shared_ptr StockFactory2::get(const std::string &key) {

std::shared_ptr pStock;

MutexLockGuard lock(mutex_);

std::weak_ptr &wpStock = stocks_[key];

pStock = wpStock.lock();

if(!pStock) // the resource is released in other thread or never exists

{

pStock.reset(new Stock(key));

wpStock = pStock;

}

return pStock;

}

std::shared_ptr StockFactory3::get(const std::string &key) {

std::shared_ptr pStock;

MutexLockGuard lock(mutex_);

std::weak_ptr &wpStock = stocks_[key];

pStock = wpStock.lock();

if(!pStock) // if the resource is released in other thread or never exists

{

// potential risk, this pointer copy is exposed to multi-thread environment in lambda function

// if StockFactory object is destructing in Thread A while Thread B call this function

// there maybe a race condition which leads to core dump

// NOTE for std::bind: this pointer is needed when bind a member function

pStock.reset(new Stock(key), std::bind(&StockFactory3::deleteStock, this, std::placeholders::_1));

wpStock = pStock;

}

return pStock;

}

void StockFactory3::deleteStock(Stock *stock) {

if(stock)

{

MutexLockGuard lock(mutex_);

stocks_.erase(stock->Key());

}

delete stock; //???

}

std::shared_ptr StockFactory4::get(const std::string &key)

{

std::shared_ptr pStock;

MutexLockGuard lock(mutex_);

std::weak_ptr &wpStock = stocks_[key];

pStock = wpStock.lock();

if(!pStock)

{

// the deleteStock function owns a copy of shared_ptr of this, which avoid the race condition

// HOWEVER, a extra copy of shared_ptr in function object may prolong the life of StockFactory by accident

pStock.reset(new Stock(key), std::bind(&StockFactory4::deleteStock, shared_from_this(), std::placeholders::_1));

}

return std::shared_ptr();

}

void StockFactory4::deleteStock(Stock *stock) {

if(stock)

{

MutexLockGuard lock(mutex_);

stocks_.erase(stock->Key());

}

delete stock; //???

}

std::shared_ptr StockFactory5::get(const std::string &key) {

std::shared_ptr pStock;

MutexLockGuard lock(mutex_);

std::weak_ptr &wpStock = stocks_[key];

pStock = wpStock.lock();

if(!pStock) // / the resource is released in other thread or never exists

{

pStock.reset(new Stock(key), std::bind(&StockFactory5::weakDeleteCallback, std::weak_ptr(shared_from_this()), std::placeholders::_1));

}

}

// awesome!!!

// call a member function in a static function via shard_ptr, which requires the object exists in fact

void StockFactory5::weakDeleteCallback(const std::weak_ptr &wkFactory, Stock *stock)

{

std::shared_ptr pFactory = wkFactory.lock();

if(pFactory)

{

pFactory->removeStock(stock);

}

delete stock;

}

void StockFactory5::removeStock(Stock *stock) {

if(stock)

{

MutexLockGuard lock(mutex_);

stocks_.erase(stock->Key());

}

}

原文:https://www.cnblogs.com/jo3yzhu/p/12229195.html

Linux多线程服务端编程笔记,陈硕Linux多线程服务端编程读书笔记 —— 第一章 线程安全的对象生命周期管理...相关推荐

  1. ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理

    ServiceProvider最终提供的服务实例都是根据对应的ServiceDescriptor创建的,对于一个具体的ServiceDescriptor对象来说,如果它的ImplementationI ...

  2. Java多线程——线程的优先级和生命周期

    Java多线程--线程的优先级和生命周期 摘要:本文主要介绍了线程的优先级以及线程有哪些生命周期. 部分内容来自以下博客: https://www.cnblogs.com/sunddenly/p/41 ...

  3. 编程思考:对象生命周期的问题

    前情提要 只要写过 c/c++ 的项目的童鞋应该对对象生命周期的问题记忆犹新.怕有人还不理解这个问题,笔者先介绍下什么是生命周期的问题? 一个 struct 结构体生命周期分为三个步骤: 出生:mal ...

  4. Kubernetes CKA认证运维工程师笔记-Kubernetes应用程序生命周期管理

    Kubernetes CKA认证运维工程师笔记-Kubernetes应用程序生命周期管理 1. 在Kubernetes中部署应用流程 2. 使用Deployment部署Java应用 2.1 Pod与D ...

  5. 详解java中Thread类,线程和进程的基本区别,多线程的好处,线程的五个生命周期,主线程和IDEA创建的Monitor Ctrl-Break守护线程;优雅地终止线程。死锁的产生

    线程:CPU调度的最小单位:线程共享堆内存和方法区,但各自享有栈空间.进程:CPU分配资源的最小单位. 为什么需要多线程:①避免其中一个模块阻塞造成系统假死:②程序异步处理(交替执行),提高程序执行效 ...

  6. Entity Framework 4 in Action读书笔记——第六章:理解实体的生命周期(一)

    本章内容包括: 理解实体状态 理解状态的转换 自动和手动改变状态 我们先从分析实体的生命周期和它的状态开始. 实体生命周期 在其生存期期间,一个实体只有一个状态.在了解如何检索状态之前,先看看什么是实 ...

  7. 【Microsoft Azure 的1024种玩法】六.使用Azure Cloud Shell对Linux VirtualMachines 进行生命周期管理...

    [文章简介] Azure Cloud Shell 是一个用于管理 Azure 资源的.可通过浏览器访问的交互式经验证 shell. 它使用户能够灵活选择最适合自己工作方式的 shell 体验,本篇文章 ...

  8. 云服务全生命周期管理

    云服务全生命周期管理主要包括的主要包括需求与设计.开发与封装.发布与上架.服务变更.服务下架等过程. 需求与设计 通过用户访谈了解.挖掘真实需求:根据用户的真实需求进行需求分析,形成<需求分析报 ...

  9. linux多线程服务器编程 豆瓣,陈硕的Blog

    陈硕(giantchen_AT_gmail_DOT_com) 2012-01-28 我在<Linux 多线程服务端编程:使用 muduo C++ 网络库>第 1.9 节"再论 s ...

最新文章

  1. hacktoberfest_Hacktoberfest 2018:如何获得免费衬衫—即使您是编码新手
  2. Tomcat漏洞说明与安全加固
  3. LVI-SAM:紧耦合的激光视觉惯导SLAM系统(Tixiao Shan新作,已开源)
  4. ABAP CHECKBOX 和LISTBOX使用指南
  5. Mysql select into outfile NULL值导出的处理方法
  6. 新博客地址: https://sanzo.top
  7. 重大革新!Dubbo 3.0来了
  8. 35岁了,转去谷歌做人工智能靠谱吗?
  9. 防风网-挡风抑尘墙:挡风抑尘墙
  10. python打印文档添加条码_12行代码教会你用python读excel文件,提取数据,生成条形码...
  11. 数据库锁表的分析与解决
  12. MATLAB点与点之间连线
  13. 唐宇迪学习笔记2:Python数据分析处理库——pandas
  14. suse linux安装rpm包,suse linux rpm 安装
  15. 生信过程中的各种文件格式
  16. 百度地图 创建应用
  17. teredo 服务器无响应,teredo 服务器能ping通但就是连不上
  18. win10便签常驻桌面_做备忘录,用win10自带的便笺工具就可以了,免费又方便
  19. 苹果开发者账号注册第一步,Apple ID 的双重认证,为 Apple ID 设置双重认证
  20. 西北计算机大赛奖金有多少,我校学生2019年中国大学生计算机设计大赛西北赛区决赛中获得佳绩...

热门文章

  1. 概率图模型基础(5)——朴素贝叶斯
  2. js 获取 url 参数 URLSearchParams
  3. 可怕!社交网络上瘾者的大脑是这个样子的
  4. IE浏览器关于带透明度的颜色显示问题
  5. CSS3 实现 div 上下滑入滑出效果
  6. vim编辑器下常用搜索技巧
  7. JavaScript: 最简单的事件代理(JS Event Proxy)原理代码
  8. 论文阅读 CVPR2022《Rethinking Semantic Segmentation:A Prototype View》
  9. 使用 DataX 实现数据同步(高效的同步工具)
  10. 浅谈原生JavaScript(二)