`
lijuanabc
  • 浏览: 125792 次
社区版块
存档分类
最新评论

随笔之如何实现一个线程池

 
阅读更多
一 缘由:
最近因工作问题,需要实现一个简单的线程池,满足一下要求,
  • 可伸缩,即一旦发现线程不够用,则可以动态增加线程。(至于缩减线程,这个可能难度比较大,暂时不考虑)。
  • 支持超时任务。比如提交一个Task,可以设置5秒后执行,并且可以设置执行一次,还是每隔5秒执行。
基本上就是这两个要求。下面讨论下实现上的问题。
二 Windows平台
1 Windows平台实现一个线程池(不使用完成端口),我最初的想法是:
  • 创建比如20个线程,然后这20个线程都WaitForXXXObject,在一个Event上。
  • 添加任务的时候,触发这个Event,为了避免惊群现象(例如只有1个任务的时候,20个线程全起来抢任务,结果其他19个线程白起来了。这样导致系统效率会显著下降。),CreateEvent的时候可以设置下,保证只有一个在等待的线程会启动。
问题:
  • 不太好实现超时任务,这20个线程,该哪一个去做超时检测呢?虽然Wait函数提供了超时机制,但总不可能这20个都去做超时检测吧?
  • 解决办法是,可能需要单独一个线程去定时检查,然后把到期的任务加入到任务队列头,然后触发Event,这样其他线程就能顺利得到任务了。
  • 另外一种方式是这20个线程中有一个做超时检查,然后执行最先到期的任务。这样的问题就是如果该线程执行的任务要是时间过长的话,将导致其他超时任务没法执行。
  • 综合考虑的话,还是用一个单独的线程去检查比较好。
2 Windows平台上使用完成端口
  • 使用完成端口就简单了,线程池中的线程个数将是CPU个数的2倍(这个是推荐值,应该也是绝大多数人的选择了)。
  • Wait的时候,当有事情发生时,内核会自动调度一个线程去执行。而且接连的任务会倾向于使用同一个线程来执行。这样可以减少线程切换的时间。所以,惊群效应由内核保证不会发生了。
  • 解决超时任务的检查,这个也没有更好的办法。只能采取和上面一样的方法了。
三 Linux平台
1 Linux平台实现线程池,基本思路和Windows一样,但是由于Linux提供的线程同步原语(POSIX)不如Windows好用,导致有一些特殊的地方需要注意:
  • 在Windows上,线程间通知无外乎就是使用Event,在Linux上,使用POSIX的condition+mutex,也能完成同样的操作,但是这种方式在linux中用得相对较少,而是大量使用pipe,创建两个fd。当线程1想唤醒线程2的时候,就可以往writeFD中写数据,这样线程2阻塞在readFD中就能返回。我之前及其没搞明白为何要使用pipe,后来突然想明白了。因为Linux上阻塞的方法就是用select,poll和epoll,其中等待的都是FD,那么采用FD这种方式,能够统一调用方法。(因为POSIX缺乏WaitForMultiObject导致,网上有一个Linux下Wait/CreateEvent的系列实现,很难下载到。呵呵)
  • 但是,现在有20个线程,总不可能创建20个pipe吧?即使有20个pipe,那么我要唤醒哪个线程,就得单独往那个线程的writeFD写数据。这明显不是一个好办法。只能使用condition+mutex了。为了避免惊群,操作cond的时候,只能使用Signal,而非Broadcast
  • 超时任务的处理,那么也只能和Windows一样的方法了
四 一个实际的线程池设计
  • 对用户来说,线程池处理的是任务。所以给线程池添加的应该是任务。那么任务有高,中,低三个优先级。另外,有些任务是需要一直占有线程的,所以还区分persist和非persist两种。设计的时候,分别有高中低三个优先级队列。线程池在挑选任务的时候,先处理高,然后是中低优先级的任务。
  • 当线程池中的线程个数小于任务个数的时候,线程池应该自动增加池中的线程。这个就是自动扩展。当线程池中的线程检测到自己长时间没有工作,并且池中线程数量超过最大设置的数量时候,那么线程应该自动退出。按这种方式就可以实现一个比较好的自动缩减。这样的话,每个线程都需要有一个超时检测,看看自己是不是多余了。
  • 对于定/超时任务,需要给线程池增加一个高优先级,persist的job。这个job自带一个定时任务队列。添加定时任务,其实就是给这个队列添加成员。然后唤醒该线程。这个线程从其中选择一个任务,然后再提交给线程池。(其实就是我们在Windows上的方案)
分享到:
评论

相关推荐

    基于Java与跨平台技术的crostitch涂鸦随笔设计与实现源码

    本项目是一款基于Java和跨平台技术的crostitch涂鸦随笔设计与实现源码,包含65个文件,其中包括30个Java源文件、16个PNG图片文件、7个JavaScript文件、2个XML文件、1个Git忽略文件、1个Markdown文件、1个Maven项目...

    20210721-国信证券-市场思考随笔之六十四:投资理念,新旧转换,越转越快.pdf

    投资理念的演变与股市新趋势 随着中国股市近来的新情况、新形势和新问题的出现,证券分析师燕翔在国信证券的市场思考随笔中提出...在这样一个快速变化的市场环境中,持续的学习和适应是投资者实现长期稳定回报的关键。

    一年级语文教学随笔.pdf

    总结起来,一年级语文教学的成功在于教师如何巧妙地结合学生特点,创造一个既充满活力又有序的学习环境。通过激发学生兴趣,灵活多样的教学方式,使用儿童化语言,适时的表扬,以及有效地课堂管理,教师能够引领这些...

    一年级数学第一学期教学随笔.pdf

    一年级数学第一学期教学随笔.pdf

    【学校老师训练感悟随笔-持一颗感恩之心】 心怀一颗感恩之心.docx

    在《【学校老师训练感悟随笔-持一颗感恩之心】 心怀一颗感恩之心》这篇随笔中,教师的自我反思和成长,以及对感恩教育的提倡,都为我们提供了一个更全面、更人性化的教育视角。在这一视角下,我们强调了教育中人的...

    关于小学一年级数学下册教学随笔.docx

    关于小学一年级数学下册教学随笔.docx

    校园文明随笔精选.doc

    给小孩们空间,让他们自由徜徉,让每一个小孩拥有阳光、平和,让每一个学生变得爽朗、自信,营建良好的教育气氛,校园是每个小孩学习生活的地点,是他们成长的摇篮,也是他们实现理想、放飞梦想的地点! 浸润在校园...

    散文随笔【黄牛散文随笔】.rar

    "散文随笔【黄牛散文随笔】.rar" 是一个压缩文件,其中包含了由作者“黄牛”创作的散文随笔集合。这个标题指示我们,这是一份文学作品,主要涵盖了散文和随笔这两种文体,可能包含作者对生活、社会、自然等各方面的...

    网恋随笔散文随笔散文.rar

    压缩包子文件的文件名称列表仅包含一个"网恋随笔散文随笔散文.pdf",同样不涉及任何IT技术或知识内容。 如果您的目的是寻找关于IT教育或者与技术相关的知识,我建议提供更具体的信息,例如具体的IT主题、编程语言、...

    交互式画图程序_交互式画图程序_

    1. 做一个随笔画程序,当鼠标左键按下拖动时,在窗口中随着鼠标位置画出轨迹,当鼠标左键抬起时则不画。2. 做一个在图形窗口的输入程序。当用户按键时,在图形窗口出现按下的键所代表的字符,并像图形界面的输入框...

    散文随笔【人间五月散文随笔】.rar

    列表中唯一的文件是"散文随笔【人间五月散文随笔】.pdf",这证实了压缩包内的主要内容是一个PDF格式的电子书,读者可以通过阅读这个文件来欣赏和学习这些散文随笔。PDF是一种通用的文档格式,能保持文档的原始布局和...

    [小忆故乡随笔]故乡随笔.rar

    综上所述,【小忆故乡随笔】不仅是一本乡土风情的随笔集,它还是一个情感和文化的载体,一个教育和自我反思的工具。它让远离故土的人们重新找到归属感,让年轻人了解到本土文化的魅力,让所有读者都能在文字的海洋中...

    一个人的城市随笔.doc

    一个人的城市随笔.doc

    时间变成河随笔.pdf

    时间管理是现代社会中一个非常热门的话题,它涉及到如何合理规划个人的日常生活与工作,实现时间的最大化利用。作者可能会从自己的经验出发,介绍一些实用的时间管理策略。例如,艾森豪威尔矩阵通过区分任务的紧急性...

    心情日记随笔300字.doc

    在这个随笔中,作者谈论了梦想的重要性和实现梦想的必要性。作者引用了丁尼生的话,强调了梦想的力量和必要性。同时,作者也强调了实现梦想需要自己的努力和行动,不能光说不练。 篇三:初中随笔300字 在这个随笔...

    苏教版一年级数学教学随笔.docx

    苏教版一年级数学教学随笔.docx

    c语言实现画图程序

    * 肾形图案是一种特殊的图形,将一个以 R 为半径的圆周等分成 2n 份,然后以等分点为圆心,以等分点到对称分割该圆的直径的距离为半径画圆周,形成肾形图案。 * 肾形图案的绘图程序使用 C 语言编写,调用了圆函数 ...

    WPF开发随笔收录-心电图曲线绘制.doc

    WPF开发随笔收录-心电图曲线绘制是一个关于WPF开发的心电图曲线绘制技术的记录,涵盖了心电图曲线绘制的实现方式、数据接收和绘制功能的实现、自动缩放功能的实现等知识点。 一、心电图曲线绘制的实现方式 心电图...

    人生随笔.doc

    通过《人生随笔.doc》中这些深刻的见解,我们可以看到,读书和学习不仅仅是一个过程,它们是一种生活方式,一种不断前进的动力。在这个快速发展的社会中,不断学习、不断进步成为了每个人的必修课。我们必须认识到...

    高中随笔,高中随笔200字(3篇)精选.doc

    在这些精选的高中随笔中,有一个共同点,就是围绕着“一草一木总关情”的话题进行展开。这个话题启发学生从自然界的微小事物中寻找灵感,去思考生命的意义和价值。草木虽然平凡,却也经历了四季的更迭,它们的生长和...

Global site tag (gtag.js) - Google Analytics