2.1 暴力抢占
那么第一节中利用的多线程方法相称下面的流程:1 当时你正在干事,比如在写文档;2 你的头找到了一个任务,要指派给你,比如帮他搞个PPT,哈;3 头命令你立时搞PPT,你这是不得一直止手头的事情,把PPT搞定了再接着写文档;…
2.2 纯粹的关照机制

那么基于纯粹的关照机制的多线程办法就像下面这样:1 当时你正在写文档;2 你的头找到了一个任务,要指派给你,帮他搞个PPT;3 头发个到你信箱,有个PPT要帮他搞定,这时你并不鸟他;4 你写好文档,接着检讨创造头有个PPT要你搞定,你开始搞PPT;… 第一种的好处是可以立即得到处理,但是很方法很粗暴,你必须立即处理这个,以是你必须处理好切换问题,省得把文档上的内容欠妥心写到PPT里。在操作系统的进程通信中,行列步队(信箱)都是操作系统掩护的,你不必关心。第二种的优点是通过关照,切换问题省心了,不过是不能立即处理的(基于关照机制,这个总是难免的),而且所有的内容都通过发送,比如PPT的格式、内容等等信息,这无疑增加了通信开销。
2.3 关照+同步层
有个折中机制可以减少通信的开销,便是提取一个同步层,还拿上面的例子来说,你把事情安排都存放在一个事情行列步队中,而且你能够担保“任何人把新任务扔到这个行列步队”,“自己取出当前第一个任务”等这些操作都能够担保不会把行列步队搅散(实在便是个加锁的行列步队容器)。再来看看处理过程和上面有什么不同:1 当时你正在写文档;2 你的头找到了一个任务,要指派给你,帮他搞个PPT;2 头有个PPT要你搞定,他把任务push到你的事情行列步队中,包括了PPT的格式、内容等信息;3 头发个(一个字节)到你信箱,有个PPT要帮他搞定,这时你并不鸟他;4 你写好文档,创造有新(这预示着有新任务来了),检讨事情行列步队知道头有个PPT要你搞定,你开始搞PPT;…事情行列步队实在便是一个加锁的容器(行列步队、链表等等),这个很随意马虎实现实现;而关照仅须要一个字节,详细的任务都push到了在事情行列步队中,因此想比2.2减少了不少通信开销。多线程编程有很多陷阱,线程间资源的同步互斥不是一两句能说得清的,而且涌现bug很难跟踪调试;这也有很多的履历和教训,因此如果让我选择,在绝大多数情形下都会选择机制3作为实现多线程的方法。
须要C/C++ Linux做事器架构师学习资料私信“资料”(资料包括C/C++,Linux,golang技能,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享
3例子——memcached
Memcached中的网络部分便是基于libevent完成的,个中的多线程模型便是范例的关照+同步层机制。下面的图足够解释其多线程模型了,个中有详细的笔墨解释。
4 小节
本节更是libevent的利用方面的技巧,谈论了一下如何让libevent支持多线程,以及几种支持多线程的机制,和memcached利用libevent的多线程模型。