Linux多线程服务端编程笔记,陈硕Linux多线程服务端编程读书笔记 —— 第一章 线程安全的对象生命周期管理...
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多线程服务端编程读书笔记 —— 第一章 线程安全的对象生命周期管理...相关推荐
- ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理
ServiceProvider最终提供的服务实例都是根据对应的ServiceDescriptor创建的,对于一个具体的ServiceDescriptor对象来说,如果它的ImplementationI ...
- Java多线程——线程的优先级和生命周期
Java多线程--线程的优先级和生命周期 摘要:本文主要介绍了线程的优先级以及线程有哪些生命周期. 部分内容来自以下博客: https://www.cnblogs.com/sunddenly/p/41 ...
- 编程思考:对象生命周期的问题
前情提要 只要写过 c/c++ 的项目的童鞋应该对对象生命周期的问题记忆犹新.怕有人还不理解这个问题,笔者先介绍下什么是生命周期的问题? 一个 struct 结构体生命周期分为三个步骤: 出生:mal ...
- Kubernetes CKA认证运维工程师笔记-Kubernetes应用程序生命周期管理
Kubernetes CKA认证运维工程师笔记-Kubernetes应用程序生命周期管理 1. 在Kubernetes中部署应用流程 2. 使用Deployment部署Java应用 2.1 Pod与D ...
- 详解java中Thread类,线程和进程的基本区别,多线程的好处,线程的五个生命周期,主线程和IDEA创建的Monitor Ctrl-Break守护线程;优雅地终止线程。死锁的产生
线程:CPU调度的最小单位:线程共享堆内存和方法区,但各自享有栈空间.进程:CPU分配资源的最小单位. 为什么需要多线程:①避免其中一个模块阻塞造成系统假死:②程序异步处理(交替执行),提高程序执行效 ...
- Entity Framework 4 in Action读书笔记——第六章:理解实体的生命周期(一)
本章内容包括: 理解实体状态 理解状态的转换 自动和手动改变状态 我们先从分析实体的生命周期和它的状态开始. 实体生命周期 在其生存期期间,一个实体只有一个状态.在了解如何检索状态之前,先看看什么是实 ...
- 【Microsoft Azure 的1024种玩法】六.使用Azure Cloud Shell对Linux VirtualMachines 进行生命周期管理...
[文章简介] Azure Cloud Shell 是一个用于管理 Azure 资源的.可通过浏览器访问的交互式经验证 shell. 它使用户能够灵活选择最适合自己工作方式的 shell 体验,本篇文章 ...
- 云服务全生命周期管理
云服务全生命周期管理主要包括的主要包括需求与设计.开发与封装.发布与上架.服务变更.服务下架等过程. 需求与设计 通过用户访谈了解.挖掘真实需求:根据用户的真实需求进行需求分析,形成<需求分析报 ...
- linux多线程服务器编程 豆瓣,陈硕的Blog
陈硕(giantchen_AT_gmail_DOT_com) 2012-01-28 我在<Linux 多线程服务端编程:使用 muduo C++ 网络库>第 1.9 节"再论 s ...
最新文章
- hacktoberfest_Hacktoberfest 2018:如何获得免费衬衫—即使您是编码新手
- Tomcat漏洞说明与安全加固
- LVI-SAM:紧耦合的激光视觉惯导SLAM系统(Tixiao Shan新作,已开源)
- ABAP CHECKBOX 和LISTBOX使用指南
- Mysql select into outfile NULL值导出的处理方法
- 新博客地址: https://sanzo.top
- 重大革新!Dubbo 3.0来了
- 35岁了,转去谷歌做人工智能靠谱吗?
- 防风网-挡风抑尘墙:挡风抑尘墙
- python打印文档添加条码_12行代码教会你用python读excel文件,提取数据,生成条形码...
- 数据库锁表的分析与解决
- MATLAB点与点之间连线
- 唐宇迪学习笔记2:Python数据分析处理库——pandas
- suse linux安装rpm包,suse linux rpm 安装
- 生信过程中的各种文件格式
- 百度地图 创建应用
- teredo 服务器无响应,teredo 服务器能ping通但就是连不上
- win10便签常驻桌面_做备忘录,用win10自带的便笺工具就可以了,免费又方便
- 苹果开发者账号注册第一步,Apple ID 的双重认证,为 Apple ID 设置双重认证
- 西北计算机大赛奖金有多少,我校学生2019年中国大学生计算机设计大赛西北赛区决赛中获得佳绩...