c – 如何根据程序的计算需求自动将线程添加到池中?

前端之家收集整理的这篇文章主要介绍了c – 如何根据程序的计算需求自动将线程添加到池中?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们有一个C程序,根据用户配置的方式,可能是cpu绑定或IO绑定.为了与程序配置松散耦合,我希望我的线程池能够自动实现程序何时受益于更多线程(即cpu绑定).如果它意识到它是I / O限制并减少了工作人员的数量会很好,但这只会是一个奖励(即我会对自动增长而没有自动收缩的东西感到满意).

我们使用Boost,所以如果有什么东西可以帮助我们使用它.我意识到任何解决方案可能都是特定于平台的,因此我们主要对WindowsLinux感兴趣,对OS X或其他任何* nix都有兴趣.

解决方法

简短回答:对cpu密集型操作和IO使用不同的固定大小的线程池.除了池大小之外,有效线程数量的进一步调整将由有效缓冲区(生产者/消费者)完成,该缓冲区同步计算机和工作流的IO步骤.

对于计算和数据密集型问题,其中瓶颈是不同资源(例如cpu与IO)之间的移动目标,在线程和线程之间进行明确区分可能很有用,特别是作为第一个近似值:

>创建的线程使用更多cpu周期(“cpu线程”)
>为处理异步IO操作而创建的线程(“IO线程”)

更一般地说,线程应该根据它们所需的资源类型进行隔离.目标应该是确保单个线程不使用多个资源(例如,避免在读取数据和处理同一线程中的数据之间切换).当一个胎面使用多个资源时,它应该被拆分,并且两个结果线程应该通过有界缓冲区同步.

通常,应该有足够多的cpu线程来饱和系统上所有可用内核的指令流水线.为了确保这一点,只需要一个“cpu线程池”,其中只包含许多专用于计算工作的线程.如果可以信任,那将是boost ::或std :: thread :: hardware_concurrency().当应用程序需要更少时,cpu线程池中将只有未使用的线程.当它需要更多时,工作就会排队.您可以使用c 11 std :: async而不是“cpu线程池”,但您需要使用您选择的同步工具(例如计数信号量)来实现线程限制机制.

除了“cpu线程池”之外,还可以有另一个专用于异步IO操作的线程池(或其他几个线程池).在您的情况下,似乎IO资源争用可能是一个问题.如果是这种情况(例如本地硬盘驱动器),则应小心控制最大线程数(例如,本地硬盘驱动器上最多2个读取线程和2个写入线程).这在概念上与cpu线程相同,您应该有一个固定大小的线程池用于读取,另一个用于写入.不幸的是,可能没有任何好的原语来决定这些线程池的大小(虽然测量可能很简单,但是如果你的IO模式非常规则).如果资源争用不是问题(例如NAS或小HTTP请求),那么boost :: asio或c 11 std :: async可能是比线程池更好的选择;在这种情况下,线程限制可以完全留给有界缓冲区.

猜你在找的C&C++相关文章