博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
worksteal thread pool
阅读量:7057 次
发布时间:2019-06-28

本文共 699 字,大约阅读时间需要 2 分钟。

worksteal的场景

  对于一个线程池,每个线程有一个队列,想象这种场景,有的线程队列中有大量的比较耗时的任务堆积,而有的线程队列却是空的,现象就是有的线程处于饥饿状态,而有的线程处于消化不良的状态,这时就需要一种方法来解决这个问题。

需要worksteal,顾名思义就是任务窃取,当一个线程处于饥饿状态时,它就会去其它的线程队列中窃取任务,解决线程饥饿导致的效率底的问题。

worksteal要点

  • 每个工作线程将任务放到它内部的队列中;
  • 队列是一个双端队列,支持LIFO的push_front和pop_front操作和FIFO的take操作。
  • 工作线程处理任务通过LIFO来处理最新的任务。
  • 当一个线程处理完了队列中的任务之后,它会试图窃取其他线程队列的任务,根据FIFO从队列的尾部取任务。
  • 如果窃取任务失败则继续尝试,直到所有的线程队列都没有任务了。

worksteal值得探讨的问题

worksteal的适用场景

  worksteal适用场景是任务之间的耗时相差比较大,即有的任务很耗时,有的任务很快完成,这种用worksteal很合适;如果任务的耗时很平均则不适合,因为窃取任务也是需要抢占锁的,会造成额外的消耗。

窃取任务的策略

  有很多种任务窃取策略,比如从任务最多的线程中窃取或随机窃取,需要根据实际情况来选择。

窃取任务的粒度

  是每次窃取一个任务还是窃取一批任务也是需要考量的,如果窃取的一批任务比较耗时,又会导致其它线程来窃取,这样造成了无谓的消耗;如果一次窃取一个任务,而任务很快完成,这又导致重新窃取,降低了效率。这个粒度也是需要根据实际情况调整的。

参考资料

 

转载地址:http://dorol.baihongyu.com/

你可能感兴趣的文章
基于MVC4+EasyUI的Web开发框架形成之旅--基类控制器CRUD的操作
查看>>
putty 相关 拷贝本地文件到服务器端
查看>>
盘点2012最不安全的网络管理员
查看>>
DEV GridControl 控件 编辑状态下数据更新问题
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
[20180606]如何dump数据库里面的汉字.txt
查看>>
C#面向对象(四)虚方法实现多态
查看>>
day3-Nfs
查看>>
iptables
查看>>
谷歌技术"三宝"之BigTable(转)
查看>>
解析JavaScript中的字符串类型与字符编码支持
查看>>
二叉树的遍历
查看>>
openssl RSA密钥格式PKCS1和PKCS8相互转换
查看>>
吴忠军-临沂一业主未交取暖费新房却被淹,损失咋处理?
查看>>
C++类中的特殊成员函数-------复制构造函数
查看>>
barManager.Menu(barSubItem)
查看>>
敏感词的过滤
查看>>
运维常用工具
查看>>
ajax写用户注册
查看>>