为每一个线程(worker)分配一个deque去存储它们各自的任务。
P0是一个线程,P1是一个线程。
如果一个任务dispatch出来另外一个任务,把这个新的任务放入到自己的task deque中,例如,fib(4) = fib(3) + fib(2),于是当前线程开始执行fib(2),把fib(3)放入到自己的task deque中。fib(2)又会生成fib(1),fib(1)又会被放入到task deque中,同时P(1) 从P0的task deque的head steal 任务fib(3),这时P0计算完了fib(0),于是去自己的task deque的tail中取出了fib(1)继续执行。
偷任务要从head去偷,head是最早被push进去的,从自己的deque中拿任务要从tail去拿,因为tail是最新被push进去的,提高cache使用的效率。