Tag: 多处理

如何将您的程序与“坏”API的调用隔离开来?

当我使用Java开发一个(学术)软件时,我被迫使用一个执行得相当糟糕的API。 这意味着对某一组输入数据的此API调用有时永远不会返回。 这一定是软件中的一个错误,因为它提供的算法是确定性的,有时会终止于一组数据,有时它会在同一组数据上遇到无限循环…… 但是,修复API或重新实现它只是超出范围。 我甚至拥有源代码,但API严重依赖于其他API,这些API没有文档,没有源代码,并且从网络上消失(或者从未在那里?)。 另一方面,这个“坏”的API是解决我遇到的具体问题的唯一一个,所以我真的不得不坚持下去。 问题是:处理API的最干净的方法是什么呢?好吧,讨厌? 当我遇到这个问题时,我决定将对API的调用放入一个单独的线程中。 然后,另一个线程偶尔会检查此线程是否已终止。 如果已经过了一定的时间,我会使用Thread#stop()处理线程并再次开始处理,希望它会在下次返回。 现在,我知道(并且当时知道)该方法已被弃用,不得使用。 但是在这种学术背景下,让软件潜在地进入未定义状态而不是崩溃是可以接受的。 忽略已经遇到无限循环的处理线程也是不可接受的,因为它做了一些CPU密集型操作,这会大大减慢用户的机器速度。 我没有尝试的另一种方法是在单独的进程而不是线程中开始处理,因为可以干净地杀死子进程而不会使软件处于不一致状态。 或者新的SwingWorker类(尚未提供)是否完成了这项工作? 它有一个cancel()方法,但文档说“尝试取消执行此任务” ,所以它看起来也不像是一种可靠的方法。

为什么单个线程进程在多个处理器/内核上执行?

假设我运行一个简单的单线程进程,如下所示: public class SirCountALot { public static void main(String[] args) { int count = 0; while (true) { count++; } } } (这是Java,因为这是我所熟悉的,但我怀疑它并不重要) 我有一个i7处理器(4核,或8计数超线程),我正在运行Windows 7 64位,因此我启动了Sysinternals Process Explorer来查看CPU使用情况,正如预期的那样,我发现它使用了大约20%所有可用的CPU。 但是,当我切换每个CPU显示1个图形的选项时,我发现使用的是4个“核心”中的1个,CPU占用率遍布整个核心: 相反,我期望的是1核最大化,但这只发生在我将流程的亲和力设置为单核时。 为什么工作负载分散在不同的核心上? 不会将工作负载分散到多个核心,因为缓存还是会导致其他性能损失? 这是为了防止一个核心过热的简单原因吗? 还是有更深层次的原因? 编辑:我知道操作系统负责调度,但我想知道为什么它“烦恼”。 当然,从一个天真的角度来看,将(主要是*)单线程进程坚持到1核心是更简单,更有效的方法吗? *我说主要是单线程,因为这里有多个theads,但只有2个在做任何事情: