线程内的线程?

Ton*_*ony 4 c pthreads

我想用pthread实现分而治之,但我不知道如果我在一个线程中创建更多线程会发生什么.

根据我的理解,如果机器有一个2核处理器,它只能同时处理2个线程.如果有超过2个线程,其他线程必须等待资源,所以如果我在更深入的时候创建越来越多的线程,实际上它可能不会提高算法的速度,因为只有2个线程可以处理同一时间.

我在网上做了一些研究,似乎上层的线程可以不活动,只有最深层的线程保持活跃状态​​.怎么做到这一点?此外,如果面线保持不活动状态,它是否会影响底线?

jus*_*tin 6

有两种基本类型:分离和可连接.

可连接的线程是您可以等待(或访问结果)终止的线程pthread_join.

使用比核心更多的线程可以帮助或伤害 - 取决于您的程序!通过多线程最小化或消除对资源的竞争通常是好的.在程序中投入太多线程实际上可以减慢进程.但是,如果核心数与线程数匹配并且其中一个线程在磁盘IO上等待(如果其他进程中没有发生重大事件),则可能会有空闲的CPU时间.

较高级别的线程可以处于非活动状态,只有最深级别的线程保持活动状态.怎么实现这个?

使用可连接线程,您可以完成您概述的嵌套线程方法,这在几个教程中得到了证明.基本流程是一个线程将创建一个或多个worker,并等待它们退出使用pthread_join.但是,在大多数情况下,诸如任务和线程池之类的替代方案是更可取的.

尽管如此,这种方法不太可能是执行的最佳方法,因为它与硬件和调度操作无关(特别是随着程序的深度和宽度的增长).

如果面线保持不活动状态,是否会影响底线?

是.然而,典型的问题是工作/线程不受约束.使用您已经概述的方法,很容易产生许多线程,并且必须在有限数量的内核上执行工作的线程数量不合理.因此,您的程序将浪费大量时间上下文切换并等待线程完成.创建许多线程也会浪费/预留大量资源,特别是如果它们是短暂的和/或空闲/等待的话.

因此,如果我在深入时创建越来越多的线程,实际上它可能不会提高算法的速度,因为只能同时处理2个线程.

这表明使用这种方法创建线程是有缺陷的.您可能希望创建一些线程,并使用基于任务的方法 - 每个线程从集合中请求并执行任务.创建一个线程需要花费大量的时间和资源.