在Muduo网络库学习过程中获得的C++知识

1.shared_ptr

为了解决多线程编程下无法确定对象是否存活的问题,引入了智能指针shared_ptr。

shared_ptr是引用计数型智能指针,当计数为0时,对象即被销毁。shared_ptr控制对象的生命期,只要有一个shared_ptr存在,对象x就不会被析构,当最后一个shared_ptr析构或reset时,对象会被析构。注意是当指针销毁,对象就被析构。借助shared_ptr还可以实现copy-on-write。

weake_ptr感知对象是否存活。如果对象存活,可以提升为shared_ptr,否则返回一个空的shared_ptr。可以来实现弱回调和线程池。

隐藏的问题:

1.在函数调用时,复制了一份拷贝,shared_ptr拷贝开销比原始指针大,影响性能,如果是boost:bind函数或者容器,则生命周期将意外延长。解决方案:在一个线程中主需要在最外层函数有一个实体对象,接下来都以以const reference方式传递该对象。

2.当最后一个指向x对象的shared_ptr离开其作用域时,x会在同一线程析构。如果该析构十分耗时,可能会拖慢关键线程的速度。解决方案:用一个单独的线程来专门做析构,通过一个BlockingQueue>把对象的析构都转移到专用线程。

运用方面:

1.将类A继承boost:enable_shared_from_this,可获得指向当前对象的shared_ptr对象。

2.分析p53页g_foos.reset(new FooList(*g_foos));//先new一个新的g_foos(与原来的g_foos地址不同),通过调用reset()函数将原来的g_foos析构,指向了新的g_foos,这时,新旧g_foos引用计数均为1达到了拷贝效果。

2.Mutex(互斥器)

用来保护临界区,任何一个时刻最多只有一个线程在此mutex划出的临界区内活动。

1.使用非递归的mutex,可以暴露逻辑上的错误。

2.用MutexGuard对象的构造和析构来加锁解锁,保证始终在同一个函数同一个scope里对某个mutex加锁解锁。

3.条件变量

一个或多个线程等待某个布尔表达式为真,即等待别的线程唤醒它。

虚假唤醒:有时候程序可能执行了notify(),使wait()线程不阻塞,但事实上并没有条件并没有满足,称之为虚假唤醒。如p41页dequeue()里while的循环条件为queue.empty()。

条件变量可用来实现BlockQueue和CountDownLatch,后者通常用于主线程等待多个子线程初始化或用于多个线程等待主线程发出“起跑”命令。








你可能感兴趣的:(muduo网络库)