worksteal thread pool

worksteal的场景

  对于一个线程池,每一个线程有一个队列,想象这种场景,有的线程队列中有大量的比较耗时的任务堆积,而有的线程队列倒是空的,现象就是有的线程处于饥饿状态,而有的线程处于消化不良的状态,这时就须要一种方法来解决这个问题。
须要worksteal,顾名思义就是任务窃取,当一个线程处于饥饿状态时,它就会去其它的线程队列中窃取任务,解决线程饥饿致使的效率底的问题。 git

worksteal要点

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

worksteal值得探讨的问题

worksteal的适用场景

  worksteal适用场景是任务之间的耗时相差比较大,即有的任务很耗时,有的任务很快完成,这种用worksteal很合适;若是任务的耗时很平均则不适合,由于窃取任务也是须要抢占锁的,会形成额外的消耗。 github

窃取任务的策略

  有不少种任务窃取策略,好比从任务最多的线程中窃取或随机窃取,须要根据实际状况来选择。 线程

窃取任务的粒度

  是每次窃取一个任务仍是窃取一批任务也是须要考量的,若是窃取的一批任务比较耗时,又会致使其它线程来窃取,这样形成了无谓的消耗;若是一次窃取一个任务,而任务很快完成,这又致使从新窃取,下降了效率。这个粒度也是须要根据实际状况调整的。blog

worksteal thread pool源码队列

参考资料get

A Java Fork/Join Framework源码

Scheduling Multithreaded Computations by Work Stealingit

相关文章
相关标签/搜索