ThreadPool注解

关于线程池是很早就想去看的,在github上找了star最多的C++ 11 版本,然而一下子看不懂,就搁置在那了。 因为昨天百度面试问到了,我甚至回答我看过但是没看完,有点尴尬,今天花了点时间学了一下基础,并对源码进行了注解。 github 地址 先说一下我现在对上面这个线程池实现原理的理解。 理解之后可以说是很简单了,这个线程池本质上是互斥和条件变量的妙用。 我先开一个事件队列,再开几个线程,首先这些线程在整体上都是死循环,但会在事件队列为空的时候进入睡眠状态(由条件变量控制)。当事件队列非空,那么我就从事件队列中取出一个事件,再将这个事件搭载在线程上运行。事件运行结束后这个线程进入下一个循环,如果事件队列为空,则又会进入睡眠状态。如此循环往复…… 这里再分享一下我的一点学习经历,关于future,胡言乱语的一些理解,有错误后续会更改。 我当前的理解是,future是作为一个异步机制的需要而出现(猜测也是开了个线程异步执行。 future可由packaged_task封装后get_future,promise关联,async生产所得。 可使用get方法获其结…

UNIX网络编程基础总结

前几天因为一直在看IPC(进程间通信),有几个问题去搜的时候无意中发现这些IPC方法其实以及不大常用了,最最常用的还是socket…… 我是一直以为socket只会在网络上使用较多,其他不大会使用,现在发现我可能真的错了,于是打算把学IPC的精力放在巩固和加深socket上,其他IPC只做大概了解。 最基础的 TCP 套接字编程 暂时只贴注释代码 Server /* *********************************************************************** > File Name: k_server.cpp > Author: Key > Mail: keyld777@gmail.com > Created Time: Fri 06 Apr 2018 09:50:54 PM CST *********************************************************************** */ #include #i

shared_ptr的一些理解

瞎看了一点博客自认为搞懂,现在没什么时间写代码,写简单记下来。 shared_ptr的是一种“引用计数型智慧指针”(RCSP),它最核心的本质在于引用计数。 并且这个引用计数器也是一个类指针。 除开这个引用计数器以外,自然还有本重要的指针了,除此之外就没有其他的成员变量。 shared_ptr与uniqe_ptr的重要区别在于,unique_ptr只能指向一个对象,这是由它的析构函数决定的,因为析构函数必定会释放掉指针所指的内存,如果指向多个,将会多次释放,引起错误。 因此,unique_ptr的构造是不允许nullptr的。 与此相对,shared_ptr却可以,而且他默认构造就是指向nullptr,在真正构造非空对象的时候,才会将两个指针用上。 并且在赋值等操作引起计数器变为 0 的时候会立刻delete,而就算没有变为0,在最后析构的时候也会强制delete。 上面那个是我的煞笔言论,shared_ptr的delete内存只会在引用计数为0的时候调用,这就造成了循环引用导致的内存泄漏问题,进而引出了weak_ptr。 写完好像很简单的样子…… 另…

红黑树源码分享

本人开学后花了三天终于在昨天3.10(也是本人的阳历生日)完成了红黑树的实现 自认为没有bug…… 不过感觉接口设计上不是很好,觉得得学习一下stl 源码在github上,点这里 上面那个是看思路自己意淫出来的,这里有个模仿STL的版本 但是没有改好。。还有几个error…… 除此之外,特别想说一个知识点,就是在模板实现上,其声明和定义是不能卸载两个文件里的,因为在编译的时候,编译器就必须知道类的大小(好吧,其实我也解释不大来…… 非要写在两个文件里的话,我只知道特化,当然,这不是很可取。 完。…

一些关于STL空间配置器的理解

一点废话 最近终于看完了《STL源码剖析》的前三章,个人觉得前三章是这本书最重要的部分,考虑到时间问题(简历还没投啊,拖太晚了),其他的具体实现先放放也罢。 关于STL中的空间配置器(allocator),在STL的运用角度上看,空间配置器是最不需要知道的东西。而在STL的实现上,空间配置器是最必须也是最先需要知道的东西。 乱七八糟的东西 首先我们必须知道的是,在C++中通过new一个新的对象,它的实际步骤可以分为两个部分:配置内存(allocat),调用构造函数(construct)。而当我们通过delete一个对象的时候,它的实际步骤也可以分为两个部分:调用析构函数(destroy),释放内存(deallocat)。 关于构造和析构,并不是我这里讲的重点,只要会点基础的cpp就好了。 而关于对象构造前的空间配置和对象析构后的空间释放,SGI STL对此的设计哲学如下: * 向system heap 申请空间 * 考虑多线程状态 * 考虑内存不足的应变措施 * 考虑过多的小型区块可能造成的内存碎片问题 核心部分 一些乱七八糟的东西讲完了(…

动态链接库与静态链接库

动态链接库与静态链接库的区别 静态链接库 静态链接库是将整个库文件都与目标程序链接在一起,整合到一个可执行文件中。 动态链接库 动态链接库与静态链接库相反,在可执行文件中,只记录了库文件的一些信息(位置啊,函数名什么的……瞎猜的),在需要的时候有OS进行调用。 另外动态链接还分为载入时链接,与运行时链接。 载入时链接是在程序载入时,将整个库文件同时载入,而运行时链接是在程序运行时发现这段函数程序未在内存中而由OS载入。 可以理解成运行时链接是动态的动态。 区别与比较 一点小区别: 静态链接库不能引用其他库文件,而动态链接库则可以。 以下讨论两者优劣势力,只谈优势,因为动态链接库的优势就是静态链接库的劣势,反之亦然。 动态链接库优势: 1. 这种链接方式,使得所有需要这个库文件的文件共享一个库文件在内存上的拷贝,与静态链接相比,可以减少内存的消耗。这对频繁调用的函数来说十分有利。 2. 维护性增强。只要保持接口不变,在修改库文件之后,只需要编译库文件即可,而静态链接库则需要重新编译整个文件。这对大项目来说,是不划算的。 3. 减小…

[转]TIME_WAIT状态的产生原因,危害,如何避免?

本文转自此博文,因无法联系作者擅自转载,若需要删除请作者留言 只有首先调用close()发起主动关闭的一方才会进入TIME_WAIT状态,进入TIME_WAIT状态的TCP连接需要经过2MSL才能回到初始状态,其中,MSL是指Max Segment Lifetime,即数据包在网络中的最大生存时间。每种TCP协议的实现方法均要指定一个合适的MSL值,如RFC1122给出的建议值为2分钟,又如Berkeley体系的TCP实现通常选择30秒作为MSL值。这意味着TIME_WAIT的典型持续时间为1-4分钟。 产生原因及好处 对于TIME_WAIT的存在,有两个理由。一个原因是为了防止一个连接中延迟的数据段会被后序的连接错误的解析。当一个连接处于2MSL状态的时候,任何到达的数据段都将会被丢弃。第二个原因是为了实现TCP全双工连接的终止可靠性。 为实现TCP这种全双工(full-duplex)连接的可靠释放 参考TCP释放连接4次挥手过程,假设发起active close的一方(通常为client)发送的ACK(4次交互的最后一个包)在网络中丢失,那么由于TC…

红黑树入门(2)——删除操作

自从上一次写完红黑树入门已经过去一个多月了……当时天真的我觉得就算再难只要花个一个下午就可以把删除操作搞懂,然而……………… 阅前须知 但是我现在在这里申明一点,其实红黑树的删除操作也算不上太难,有一点是因为分类情况太多了。而我迟迟没有理解的一个主要原因在于 我们讨论的删除节点并不是我们在红黑树删除操作中传入的删除的节点,而是被删除节点的替换节点 因为在二叉查找树的删除过程中,被删除的节点实际上会被一个前驱最大节点或者是后继最小节点来替代。 而我们在红黑树中,可以在替换节点的同时,替换节点的颜色改成删除节点的颜色,那么我们的修复目标一下子缩小到了几乎是最下面的子树层,并且对删除节点处的性质并没有任何改变。实在是妙极! 另外感谢这篇文章,我是通过这个博文学习的,并且图片也来自这个博客,写的很好,推荐。 正文 由前文所得,我们的删除操作可以分为两部分,一个是删除,一个是修复。 当然插入的时候也可以分为插入和修复两部分,而且很有条理性,但是插入太简单了,也没细说。 在这里仍然需要提一个大前提:在二叉查找树的删除操作中,对于替换节点,其实是有两个选择的,…