2

所以我有一个程序可以作为其他程序的一种“外壳”。它的核心是传递一个类、一个方法名和一些参数,并处理函数的执行,其想法是允许其他程序员基本上安排他们的进程在这个 shell 服务上运行。一切正常,除了一个问题。通常,这些计划执行的进程占用大量 CPU。有时,被调用的进程开始使用如此多的 CPU,以至于我负责检查计划和启动其他作业的线程在很长一段时间内都没有机会运行,从而导致调度问题和缺乏足够的反应能力。不幸的是,我不能在实际运行的代码中插入 Thread.Sleep() 调用,因为我并不真正“拥有”它。

所以我的问题是:是否可以在不修改在该线程中运行的实际代码的情况下每隔一段时间强制任意线程(我启动的)休眠(yield)?除此之外,是否有某种方法可以在运行时将 Thread.Sleep() 调用“注入”到我将要动态运行的代码中?

4

5 回答 5

10

并不真地。您可以尝试使用该属性更改其他线程的优先级Priority,但您不能真正注入“睡眠”调用。

Thread.Suspend(),但我强烈建议你不要使用它。您真的不想让另一个线程在任意时间挂起,因为它可能拥有重要资源。(这就是为什么该方法被标记为过时并且周围有各种警告的原因:)

降低其他任务的优先级并可能提高您自己任务的优先级可能是最好的方法。

于 2009-06-29T12:57:07.573 回答
4

不,没有(据我所知),但是您可以更改线程的调度优先级 - http://msdn.microsoft.com/en-us/library/system.threading.thread.priority.aspx

在启动线程时降低运行问题代码的线程的优先级(或提高调度线程的优先级)

于 2009-06-29T12:59:21.797 回答
1

您可以使用Thread.Suspend挂起线程(已弃用且不推荐),也可以通过更改Thread.Priority降低其优先级。

于 2009-06-29T12:59:58.083 回答
0

实际上,您所说的内容存在很大的安全风险,因此大多数平台都不会支持。未经您的许可允许其他程序影响您的状态通常不是一个好政策。

如果可能的话,您可以将有问题的 prog 加载到您在代码中创建的自己的进程中,然后您可以设置该进程的优先级或使其休眠,或者您有什么。我不是 Windows 编程方面的专家,所以你的里程可能会有所不同。

于 2009-06-29T13:03:15.720 回答
0

你不应该这样做。线程不应该 Sleep() 除非他们自己认为这是一个好主意。

无论如何,这与您的问题无关。您的问题显然是由于 CPU 不足,管理线程无法运行。为了解决这个问题,给这些线程一个更高的优先级就足够了。在每个时间片结束时,操作系统将确定接下来应该运行哪些线程。线程优先级在某种程度上是动态的:一段时间未运行的线程将相对于刚刚运行的线程向上移动。但是管理线程的更高的基本线程优先级意味着它们不需要这种动态提升来仍然被调度。

如果这仍然不够,请降低工作线程的优先级。这意味着工作线程在获得新的时间片之前必须休眠更长时间。

最后,确保启动新工作线程的线程以非常低的优先级运行。这意味着如果系统达到 CPU 限制,则不会创建新线程。这实现了一个简单但强大的节流机制。

于 2009-06-29T13:21:07.150 回答