【问题标题】:How can I simulate the simultaneous execution of multiple tasks in .Net?如何在 .Net 中模拟多个任务的同时执行?
【发布时间】:2013-07-17 17:25:32
【问题描述】:

我想同时运行多个任务。需要明确的是,我希望它们是同时的,而不仅仅是并行的——在任何时间点,我希望每个任务都消耗相同数量的 CPU 周期,在一定的容差范围内。在 .Net 中如何做到最好?

【问题讨论】:

  • 你不能保证一个线程会有多少CPU Cycles,这是因为操作系统可能会阻塞一些线程而不是其他线程来运行其他程序(包括操作系统本身)
  • 您只需要线程彼此同步吗?如果这是你想要的,那很容易做到。请添加一个说明,说明您要执行的操作具有“相同数量的 CPU 周期”要求,我们可以为您提供一些选择。
  • 不,线程不需要彼此同步。我正在对一个工业过程进行多次模拟,并在模拟进行时显示中间结果。用户不仅要评估结果,还要评估所使用的不同算法的性能。因此,将使用 X 秒 CPU 时间的模拟产生的一组结果与使用 2X 秒 CPU 时间的模拟产生的另一组结果一起显示是不合适的。我需要模拟大致同时进行。
  • 然后修复问题陈述,因为该评论在问题中根本不明显。

标签: .net multithreading task-parallel-library


【解决方案1】:

有两种方法可以衡量这一点,Wall Clock time 和 CPU time。大多数人可能会告诉您使用Stopwatch 来衡量性能,但这可能是您想要的数字,也可能不是。

如果您只关心实时执行需要多长时间,请使用秒表,如果您想知道线程本身运行了多长时间,可以通过 Native API 调用 GetThreadTimes 来完成。这是一篇使用它的文章on CodeProject。请注意,您将无法为此使用 TPL,您需要使用真正的 Threads 作为 TPL 它回收线程,因此时间不是任务的实际执行时间。

第二个选项是使用QueryThreadCycleTime。这不会给你时间,但会给你当前线程已执行的周期数,你可以在开始时做一个,在结束时做一个,然后减去两个数字。再次注意Task 重用线程,因此除非您使用完整的线程,否则该数字可能可靠也可能不可靠。

请注意,您不能直接转换 cycles->seconds,因为许多处理器(尤其是移动处理器)不以固定速度运行,因此没有可以乘以得到经过时间的常数秒。但是,如果您使用的是不改变其速度的处理器,那么从周期中获取挂钟时间将是一个简单的数学问题。

【讨论】:

  • 谢谢; QueryThreadCycleTime 听起来正是我所需要的。但是,仍然缺少一个难题:假设我发现一个线程比另一个线程消耗了更多的 CPU 周期,并且我想纠正这种不平衡。既然不推荐使用 Thread.Suspend,我该如何挂起线程?我想我可以在我自己的类中实现 Suspend 和 Resume 方法,但是 Thread.Suspend 和 Thread.Resume 不需要我创建这些方法,我想知道它们是否已被弃用,取而代之的是也不需要它们的替代方法。
  • 当您说“暂停”时,您的意思是暂停线程以稍后启动它,还是您的意思是终止线程并阻止它继续运行?
  • 暂停线程并稍后启动。我刚刚发现了 Thread.Sleep。也许这就是我需要的,而不是暂停和恢复。
猜你喜欢
  • 2021-06-26
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多