天天看点

c++多线程多进程服务器muduo相关函数查询表(二)

如表一所示,本文也只是作为记录,想了解具体的函数使用方法,请进入相应的链接中查看:

1、pthread_once(pthread_once_t *once_control, void (*init_routine) (void))

    在多线程环境中,有些函数仅需要执行一次,可以采用pthread_once来声明,具体是哪个线程

执行由Linux内核调度来进行

https://blog.csdn.net/sjin_1314/article/details/10934239

2、智能指针——shared_ptr

    std::shared_ptr使用引用计数. 每一个shared_ptr的拷贝都指向相同的内存. 

在最后一个shared_ptr析构的时候, 内存才会被释放.

(1)同一个shared_ptr被多个线程“读”是安全的。

(2)同一个shared_ptr被多个线程“写”是不安全的。

(3) 共享引用计数的不同的shared_ptr被多个线程”写“ 是安全的

同一个shared_ptr被多个线程读,是线程安全的;

同一个shared_ptr被多个线程写,不是 线程安全的;

共享引用计数的不同的shared_ptr被多个线程写,是线程安全的。 

    对于第三点,我们一般采用: 

对于线程中传入的外部shared_ptr对象,在线程内部进行一次新的构造,

例如: sharedptr AObjTmp = outerSharedptrObj;

https://blog.csdn.net/yusiguyuan/article/details/20076061

https://blog.csdn.net/yusiguyuan/article/details/22037833

https://blog.csdn.net/u013007900/article/details/79939078

https://www.sogou.com/link?url=DOb0bgH2eKh1ibpaMGjuy-bOxZBaCgftTbIYflqkPa4bl_9GOWLsw65J0qkIwiwu8vlK3s6aheDzozhqK6R1Ug..

3、智能指针——weak_ptr

    weak_ptr是为配合shared_ptr而引入的一种智能指针来协助shared_ptr工作,它可以从一个

shared_ptr或另一个weak_ptr对象构造,它的构造和析构不会引起引用记数的增加或减少。没有重载*

和->但可以使用lock获得一个可用的shared_ptr对象,注意, weak_ptr 在使用前需要检查合法性.

    weak_ptr的一个重要用途是通过lock获得this指针的shared_ptr,使对象自己能够生产

shared_ptr来管理自己,但助手类enable_shared_from_this的shared_from_this会返回this的

shared_ptr,只需要让想被shared_ptr管理的类从它继承即可

    使用 weak_ptr 解决 shared_ptr 因循环引有不能释放资源的问题

http://www.cnblogs.com/diysoul/p/5930372.html

https://blog.csdn.net/mmzsyx/article/details/8090849

4、智能指针——unique_ptr

    unique_ptr是一种定义在中的智能指针(smart pointer)。它持有对对象的独有权——两

个unique_ptr不能指向一个对象,不能进行复制操作只能进行移动操作

    与shared_ptr不同,unique_ptr没有定义类似make_shared的操作,因此只可以使用new来

分配内存,并且由于unique_ptr不可拷贝和赋值,初始化unique_ptr必须使用直接初始化的方式

    事实上不能拷贝unique_ptr的规则有一个例外:我们可以拷贝或赋值一个将要被销毁的unique_ptr

https://www.sogou.com/link?url=DOb0bgH2eKh1ibpaMGjuy6YnbQPc3cuKncNgn2NO7OtomuBEhdSpHkUUZED5fr2Ou2hqaUvI2wY_c1NbUyGLxQ..

http://www.cnblogs.com/DswCnblog/p/5628195.html

5、 boost模板类——std::enable_shared_from_this

    (1)std::enable_shared_from_this 能让一个对象(假设其名为 t ,且已被一个 

std::shared_ptr 对象 pt 管理)安全地生成其他额外的 std::shared_ptr 实例(假设名为 pt1, 

pt2, ... ) ,它们与 pt 共享对象 t 的所有权。

    (2)若一个类 T 继承 std::enable_shared_from_this<T> ,则会为该类 T 提供成员函数:

shared_from_this 。 当 T 类型对象 t 被一个为名为 pt 的 std::shared_ptr<T> 类对象管理时,

调用 T::shared_from_this 成员函数,将会返回一个新的 std::shared_ptr<T> 对象,

它与 pt 共享 t 的所有权。

    (3)在异步调用中,存在一个保活机制,异步函数执行的时间点我们是无法确定的,

然而异步函数可能会使用到异步调用之前就存在的变量。为了保证该变量在异步函数执期间一直有效,

我们可以传递一个指向自身的share_ptr给异步函数,这样在异步函数执行期间share_ptr所管理的对

象就不会析构,所使用的变量也会一直有效了(保活)。这就确保了对象的生存周期大于回调中构造的函数对象的生命周期

https://blog.csdn.net/caoshangpa/article/details/79392878

https://my.oschina.net/hevakelcj/blog/2059230

https://www.cnblogs.com/jily/p/6424231.html

6、循环引用——基于计数的共享机制(shared_ptr)将会被彻底击败。

    在使用基于引用计数的智能指针时,要特别小心循环引用带来的内存泄漏,循环引用不只是

两方的情况,只要引用链成环都会出现问题。当然循环引用本身就说明设计上可能存在一些问题,如

果特殊原因不得不使用循环引用,那可以让引用链上的一方持用普通指针(或弱智能指针weak_ptr)即可。

https://www.cnblogs.com/itZhy/archive/2012/10/01/2709904.html

7、c++中的静态成员和静态成员函数

    当调用一个对象的非静态成员函数时,系统会把该对象的起始地址赋给成员函数的this指针。

而静态成员函数并不属于某一对象(所有对象共有,没有this指针,不能访问本类中非静态成员,有点

惨),它与任何对象都无关。

    可以说静态成员函数的出现就是为了处理静态成员变量的。在C++中,静态成员是属于整个类

的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用

静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。

https://blog.csdn.net/vict_wang/article/details/81288272

https://blog.csdn.net/csunking/article/details/45618273

8、TCP的保活机制

    双方建立交互的连接,但是并不是一直存在数据交互,有些连接会在数据交互完毕后,主动

释放连接,而有些不会,那么在长时间无数据交互的时间段内,交互双方都有可能出现掉电、死机、

异常重启等各种意外,当这些意外发生之后,这些TCP连接并未来得及正常释放,那么,连接的另一

方并不知道对端的情况,它会一直维护这个连接,长时间的积累会导致非常多的半打开连接,造成

端系统资源的消耗和浪费,为了解决这个问题,在传输层可以利用TCP的保活报文来实现。

https://www.sogou.com/link?url=hedJjaC291OB0PrGj_c3jLEFOfDkmI-hPoBZOqRNCvddzunhCynbGLU6DtrNzhoz_PqQBo74RSy_8_sVDrvNTg..

https://blog.csdn.net/s_lisheng/article/details/87288445

9、boost::bind()

boost提供的bind,它提供了统一的接口,提供了更多的支持,比如说它增加了shared_ptr,虚函数,类成员的绑定。

https://www.cnblogs.com/blueoverflow/archive/2015/08/18/4740093.html

https://blog.csdn.net/acs713/article/details/24981833