细粒度多线程 - 工作任务应该做多少?

时间:2009-08-26 12:35:20

标签: c multithreading

我正在使用work_pile模式,因此线程始终在运行并在信号量上等待传入的新函数指针+队列中的数据。那就是苹果营销人员现在称之为Grand Central Dispatch并宣传为新切片面包的东西。

我只是想知道如何找出将短任务分成两个甚至更短的任务是否有用。是否有规则可以判断是否值得排队新对象?

3 个答案:

答案 0 :(得分:1)

两个可能的答案:

  • 取决于。
  • 基准测试。

我更喜欢第二个。

无论如何,如果两个任务总是一个接一个地运行(即顺序),我认为没有任何收益可以拆分它们。

答案 1 :(得分:1)

多任务处理的限制是您拥有多少核心以及并发算法的多少。各种类型的开销(包括锁定)可以减少并发数量,降低甚至逆转多任务处理的好处。这就是为什么当有独立的,长期运行的任务时它最有效。话虽如此,只要开销不会吞噬性能提升,就可以在核心之间划分一个简短的任务。

答案 2 :(得分:1)

简短的回答是,您需要考虑资源+工作量+基准测试。

以下是一些可能发生故障的方法:

  1. 你有空闲线程吗?工作量是否足够大,以至于线程需要很长时间才能完成另一个线程正在等待重新分配(即线程多于工作)?
  2. 你有足够的工作吗?整个任务完成得如此之快以至于不值得考虑其他线程吗?请记住,增加多线程会增加一些(有时)很小但可测量的数量的开销。
  3. 你有资源吗?你有更多的线程要给?你有闲置的CPU周期吗?
  4. 所以,简而言之,我要说你在打字之前需要思考。如果您已经拥有可以运行的代码,那就像银行里的钱一样。是否值得投入更多时间来提高代码的生产率,或者投资回报率是否过低(或为负数!)?