C#线程,GetAvailableThreads()
我有一个线程问题 我正在将C#线程,GetAvailableThreads(),c#,multithreading,C#,Multithreading,我有一个线程问题 我正在将ThreadPool.SetMaxThreads(maxThreads,System.Environment.ProcessorCount)设置为10 但是当我检查有多少线程是可用的ThreadPool.GetAvailableThreads()时,它说有(maxThreads-1)那么9个线程,但随后继续使用10个线程 你知道为什么吗 感谢您的帮助。在理想情况下,我们将有一个线程/物理内核。这样,我们就不再有上下文切换,这是一种成本相当高的操作。但在我们拥有数百核处理
ThreadPool.SetMaxThreads(maxThreads,System.Environment.ProcessorCount)
设置为10
但是当我检查有多少线程是可用的ThreadPool.GetAvailableThreads()
时,它说有(maxThreads-1)那么9个线程,但随后继续使用10个线程
你知道为什么吗
感谢您的帮助。在理想情况下,我们将有一个线程/物理内核。这样,我们就不再有上下文切换,这是一种成本相当高的操作。但在我们拥有数百核处理器之前,这是不现实的
不管怎样,正如Marc所建议的,除非您真的知道自己在做什么,否则不应该弄乱线程池参数。线程池的.Net实现背后的逻辑相当不错,它可以成功地处理大多数场景 您是否正在使用类似的方法对线程进行排队
ThreadPool.QueueUserWorkItem(callback, obj)
然后做一些类似的事情:
WaitHandle.WaitAll(WaitHandle)
我的猜测是,实际计算正在运行的线程的方式存在问题,但没有更具体的说明,这只是猜测。一个线程池线程正在监视线程池中其他线程的等待操作。这应该可以解释maxthreads-1的结果
我不知道为什么它会出现使用所有10线程然后。这可能是你用9来做你的工作,用1来监视和排队。这是你在过去30分钟内第三次问这个问题。我不知道这个问题的答案,但你说这会导致什么“问题”?你真的不应该弄乱这些数字。。。如果您想要一个受限制的池,您应该编写自己的池(或者等到.NET 4.0到来,因为CCR/TPL包含这样的…)。potser没有提到的是,他们只在测试运行程序主机进程中运行时才看到这种行为:这是我第二次问这个问题,因为您决定关闭另一个。这是一个不同的问题!我想你看到的是一个没有问题的地方。正如马克指出的,“你不应该真的弄乱这些数字”