CodingHanYa / workspace

workspace是基于C++11的轻量级异步执行框架,支持:通用任务异步并发执行、优先级任务调度、自适应动态线程池、高效静态线程池、异常处理机制等。
Apache License 2.0
916 stars 136 forks source link

请问线程池可以处理高递归的任务吗 #16

Open YukunJ opened 1 year ago

YukunJ commented 1 year ago

假设原来有类似这样一个会产生很高递归栈的函数:

int fib(int n) {
  if (n <= 1) {
    return 1;
  }
  return fib(n-1) + fib(n-2);
}

把它改写用threadpool后,有类似这样的:

int fib(int n) {
  if (n <= 1) {
    return 1;
  }
  int a = pool.submit(fib(n-1));
  int b = pool.submit(fib(n-2));
  return a + b;
}

但是我有一个困惑是, 在计算fib(n-1)和fib(n-2)时 原来的fib(n)还是挂在线程池里的某一个worker身上没法被销毁, 也不能被销毁. 这样的话递归不了几层, 所有的线程worker都卡住了.

当然如果超出了现有的线程数量可以去新开数量, 但是面对高递归任务时, 开出来大几百个线程worker会很快使得系统性能下降.

请问有什么能保存当前的context但是又不卡住一个线程资源的使用方法吗

CodingHanYa commented 1 year ago

我觉得让线程从队列尾部而不是头部开始处理任务可能可以解决这个问题。但目前Hipe确实不具备这样的能力。一种简单的替代就是把递归任务放在一个任务里,或者尝试一下以任务组的形式提交,并把这个任务组倒过来塞进去。