C#中的多线程

Multi Threading in C#

在 C# 中,我想进行多线程处理,比如我有线程 T1 和线程 T2。我执行以下操作:

Thread T1 = new Thead(some_func).Start() 
Thread T2 = new Thread(some_other_func).Start().

通过这样做,我是在跨内核还是在单内核中生成线程。如果它是单核的,我怎么能跨核呢?有没有内置的方法?或者我必须明确地做?有人建议使用 ThreadPool。当我们使用线程池时到底发生了什么,它是如何实际使用的?

一些快速回答:

  1. By doing this am I spawning threads across the cores or in the single core?

您正在创建多个线程。它们是否在不同的内核上执行完全取决于框架和(因为 .NET 通常将工作委托给 OS)操作系统。但是,如果内核可用,那么通常会使用它们。

  1. If it is in single core, how can I do it across cores.
  2. Is there any built in method? or i have to do it explicitly?.

见上文。你对此没有真正的控制权。 Windows 和 .NET 提供机制来 限制 线程在哪个内核上运行(即将 "thread affinity" 设置为特定内核或内核组),但您可以不要强制您的线程集合使用比 .NET 以其他方式提供的更多的内核。

幸运的是,正如我上面提到的,.NET 通常会使用尽可能多的可用内核。

  1. some people suggest to use ThreadPool. What actually happens when we use thread pool and how is it actually used?

线程池是抽象线程集合的构造,每个线程都可以根据需要重复使用。这很有用,因为在创建线程时会产生一些开销(尤其是在 Windows ......在 *nix 操作系统上不是那么多)。

.NET 线程池开始时是空的(或者线程数非常少)。当您向它排队时,它首先会寻找可用的空闲线程。如果有,它会通知该线程执行您排队到线程池的委托。否则,它会创建一个新线程(可能先等待片刻,以防某些线程池线程空闲并可以重用),并使用该线程执行您的委托。

.NET ThreadPool class 封装了此行为。请注意,线程池被多种机制使用,包括委托的直接异步调用(即每个委托类型具有的 BeginInvoke() 方法)、框架中的各种异步 API,以及某些类型的异步操作开始使用Task class.

当您显式创建 Thread 对象时, 使用它。

要更详细地了解线程和 .NET 线程池,请参阅有关该主题的各种 MSDN 文档页面。恕我直言,对于 Whosebug 问题,任何比上述内容更详细的内容都太宽泛了。