2

我有一个用 Haskell 编写的计划算法,其任务是在给定的时间内评估一组可能的计划,其中评估过程可以运行任意时间以产生越来越准确的结果。执行此操作的自然且据称最有效的方法是为每个评估任务提供自己的轻量级 Haskell 线程,并让主线程在休眠指定的时间后收集结果。

但实际上,在整个可用时间内,总是有一两个线程处于 CPU 饥饿状态。我自己对信号量/等控制执行的实验表明,这很难解决,因为我似乎无法强制给定线程停止执行(包括使用 Control.Concurrent 中的“yield”。)

是否有一种众所周知的方法来确保任意数量的 Haskell 线程(不是 OS 线程)在(相当短的)挂钟时间跨度内每个接收大致均匀的 CPU 时间?如果做不到这一点,这是确保执行相同迭代的多个线程在给定数量的内核上相当“轮流”以使所有内核都被使用的好方法吗?

4

1 回答 1

3

AFAIK,Haskell 线程应该获得大致相同数量的 CPU 能力,只要它们都在积极地尝试工作。不会发生的唯一原因是如果他们开始进行阻塞 I/O 调用,或者每个线程只运行几毫秒或其他什么。

也许您看到的问题实际上是每个线程只运行一瞬间,产生一个未计算的表达式作为其结果,然后主线程对其自身进行计算?如果是这样的话,看起来主线程正在获得所有的 CPU 时间。

于 2013-08-03T06:57:37.153 回答