《Linux多线程服务端编程 使用muduo C++网络库》
第1章 线程安全的对象生命期管理
P3 开篇:
编写“线程安全的类”,容易,使用同步原语即可。 ———— 指在类的成员函数中使用同步原语。
对象的“生死”不能由自身的mutex来保护。
———— 对象的构造和析构这两个过程,会有线程安全的问题。其中析构更是严重,本章即是重点分析这个问题。
1.1 先列出析构时的可能会出现的竟态情况。本章的目的即是用 shared_ptr来解决。———— (此节这个开篇有点说着急了)
1.1.1 展开说明 “线程安全的类”
1.1.2 先摆开 P45的两个工具,MutexLock 和 MutexLockGuard
1.1.3 通过使用上述两个工具,编写出 “线程安全的类”: Counter.
———————— 引出Counter对象动态创建的线程安全问题
1.2 对象创建时,线程安全问题 通过两段式构造来解决
1.3 对象销毁时的线程安全问题 ————来到了重头戏!!!
1.3.1 先解释不能通过“成员同步原语变量”来解决
1.3.2 进一步解释不能通过mutex来保护析构
1. 析构问题;基类派生类的析构过程; 析构本身 ————此段说了三个小问题
2. 不仅是析构,同时读写也有问题, —————— 有点说岔了???
3. 接上(2.),赋值运算也有问题 ———— 进一步说岔 ???
一个解决办法,通过比较对象地址的大小
1.4 通过Observer模式来说明 线程安全 问题
根源:判断指针是否合法没有高效办法
对象的三种关系,后两种关系是 问题所在
简单办法是 只创建不销毁 ,但存在问题。
原始指针版本的Observer代码,说明问题。
1.5 分析原始指针的问题
1.6 解决原始指针问题的 神器: shared_ptr / weak_ptr 谈了两者的几个关键点
1.7 接1.5吧,
系统说明 内存问题,6点, 使用智能指针能解决 前5点。
又补充说明智能指针的两点: 值语义;模板参数是incomplete类型。
1.8 使用智能指针改写了新版本的Observer代码。
但也存在问题: 侵入性,不是完全线程安全,锁争用,死锁
—————— 留到P28 讨论, 作者的意思应该是这是Observer 固有的缺陷,替代的办法是:信号/槽
下面开始进入攻坚部分!!!
1.9 shared_ptr对象本身的 线程安全问题,需要mutex 配合
1.10 对 shared_ptr 的技术分析
1. 意外延长对象的生命周期 : 1). shared_ptr是强引用。 2). 和boost::bind一块用的时候
2. 函数参数问题
3. 析构动作在创建时被捕获 ———— 其实就是P22,***那行, 构造和析构 写在一块
4. 析构所在的线程 ———— 是不是有说岔开了??? 单独的线程去专门做析构
5. 现成的RAII handle ———— 不是很懂, 循环引用个问题 应该就是下面1.11 说的了,
1.11 对象池:股票工厂
shared_ptr 的析构定制析构,———— 1.10 的 第3小点
然后就是1.10 的 第5小点 ,循环引用的问题:this指针的线程安全问题
———— P23第一行说是 1.11.2 弱回调来解决,感觉是说岔了???
实际应该 是1.11.1 马上来开始着手这个循环引用的问题了
1.11.1 enable_shared_from_this 来解决上述循环引用的问题,但意外延长生命周期
1.11.2 进一步使用“弱回调”解决相互引用的对象析构次序的问题
1.12 又开始歪楼???
除了两个智能指针,别的方案。
1.13 否定之否定,进一步升华
ilovecpp : 干脆不使用跨线程对象, 使用流水线,生产者消费真,任务队列
———— 在P31 四项原则 第二点 呼应了。
———— 应该是类似于上面的 用 信号/槽 代替Observer, 从更高维度来思考问题???
1.14 打补丁:信号/槽 代替Observer
--
修改:CyberPunker FROM 203.218.252.*
FROM 203.218.252.*