C#中的多线程
Multi Threading in C#
在 C# 中,我想进行多线程处理,比如我有线程 T1 和线程 T2。我执行以下操作:
Thread T1 = new Thead(some_func).Start()
Thread T2 = new Thread(some_other_func).Start().
通过这样做,我是在跨内核还是在单内核中生成线程。如果它是单核的,我怎么能跨核呢?有没有内置的方法?或者我必须明确地做?有人建议使用 ThreadPool。当我们使用线程池时到底发生了什么,它是如何实际使用的?
一些快速回答:
- By doing this am I spawning threads across the cores or in the single core?
您正在创建多个线程。它们是否在不同的内核上执行完全取决于框架和(因为 .NET 通常将工作委托给 OS)操作系统。但是,如果内核可用,那么通常会使用它们。
- If it is in single core, how can I do it across cores.
- Is there any built in method? or i have to do it explicitly?.
见上文。你对此没有真正的控制权。 Windows 和 .NET 提供机制来 限制 线程在哪个内核上运行(即将 "thread affinity" 设置为特定内核或内核组),但您可以不要强制您的线程集合使用比 .NET 以其他方式提供的更多的内核。
幸运的是,正如我上面提到的,.NET 通常会使用尽可能多的可用内核。
- 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 问题,任何比上述内容更详细的内容都太宽泛了。
在 C# 中,我想进行多线程处理,比如我有线程 T1 和线程 T2。我执行以下操作:
Thread T1 = new Thead(some_func).Start()
Thread T2 = new Thread(some_other_func).Start().
通过这样做,我是在跨内核还是在单内核中生成线程。如果它是单核的,我怎么能跨核呢?有没有内置的方法?或者我必须明确地做?有人建议使用 ThreadPool。当我们使用线程池时到底发生了什么,它是如何实际使用的?
一些快速回答:
- By doing this am I spawning threads across the cores or in the single core?
您正在创建多个线程。它们是否在不同的内核上执行完全取决于框架和(因为 .NET 通常将工作委托给 OS)操作系统。但是,如果内核可用,那么通常会使用它们。
- If it is in single core, how can I do it across cores.
- Is there any built in method? or i have to do it explicitly?.
见上文。你对此没有真正的控制权。 Windows 和 .NET 提供机制来 限制 线程在哪个内核上运行(即将 "thread affinity" 设置为特定内核或内核组),但您可以不要强制您的线程集合使用比 .NET 以其他方式提供的更多的内核。
幸运的是,正如我上面提到的,.NET 通常会使用尽可能多的可用内核。
- 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 问题,任何比上述内容更详细的内容都太宽泛了。