![]() |
1
1
有趣的问题。 我编写了一个示例程序,只执行这个操作。它有一个类,将执行一些处理器密集型工作,然后返回。我指定要运行的线程总数,以及要运行工作的总次数。然后,程序将在所有线程之间平均分配工作(如果只有一个线程,那么它只获取所有线程),并启动所有线程。 我在一个单进程虚拟机上运行这个程序,因为我可以找到一台真正的计算机,里面只有一个处理器。 独立运行:
这似乎表明,在一个单进程的PC上,有许多线程在做处理器密集型的工作,Windows足够聪明,不能快速地将它们切换回第四个进程,而且它们所花费的时间差不多相同。 一起跑(或者尽可能地同时推动回车键):
这就是问题的症结所在。当您运行10个线程+1个线程时,它们的调度似乎都是一样的。10个线程每个线程花费了1/10的时间(因为有第11个线程在运行),而另一个线程花费了几乎两倍的时间(实际上,它在前56秒完成了1/10的工作,然后在接下来的43秒完成了9/10的工作……这是正确的)。 结果:window的调度程序在线程级别上是公平的,但在进程级别上是不公平的。如果你制作了大量的线程,那么你就可以把其他不聪明的进程留下来,让大量的线程高高而干。或者只要做对了,我们就有一个线程池:—) 如果您有兴趣自己尝试,可以找到我的代码: http://teeks99.com/ThreadWorkTest.zip |
![]() |
2
3
任务切换总是会有一些开销,所以如果线程没有阻塞任何东西,那么线程越少越好。此外,如果线程没有执行相同的代码部分,那么每次切换时都会刷新一些缓存。 另一方面,差异可能无法测量。 |
![]() |
3
1
调度开销可能会使具有10个线程的应用程序比具有1个线程的应用程序慢。除非创建一个测试,否则您将无法确定。 有关多线程处理的一些背景,请参见 http://en.wikipedia.org/wiki/Thread_(computer_science) |
![]() |
4
1
这很可能取决于操作系统调度程序。例如,在单线程的日子里,调度器只知道进程,并有“niceness”这样的度量来计算分配多少。 在多线程代码中,如果另一个进程只有一个线程,那么一个拥有100个线程的进程可能无法获得99%的CPU时间。另一方面,如果您只有两个进程,其中一个是多线程的,我会怀疑操作系统可能会给它更多的总体时间。然而,阿法克什么都不能保证。 同一进程中线程之间的切换成本可能比进程之间的切换成本更低(例如,由于缓存行为)。 |
![]() |
5
0
您必须考虑的一件事是事务另一端的等待时间。拥有多个线程将允许您在准备下一个事务时,在一个线程上等待响应。至少我是这样理解的。所以我认为一些线程会比一个更好。 另一方面,您必须考虑处理多个线程所涉及的开销。申请的细节是这里考虑的重要部分。 |
![]() |
user107586 · 如何处理等待句柄不会导致无限循环? 8 月前 |
![]() |
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 8 月前 |
![]() |
BenjiFB · C#内存缓存:在一次操作中追加到列表? 8 月前 |
![]() |
András Takács · Python多线程问题 1 年前 |
|
András Takács · Python多线程错误 1 年前 |