C#中的多线程

时间:2015-01-16 10:32:45

标签: c# multithreading

在C#中,我想做多线程说我有线程T1和线程T2。我这样做:

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

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

1 个答案:

答案 0 :(得分:0)

一些快速回答:

  
      
  1. 通过这样做,我会在核心或单核心中产生线程吗?
  2.   

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

  
      
  1. 如果它是单核,我怎么能跨核心。
  2.   
  3. 有内置方法吗?或者我必须明确地做到这一点?。
  4.   

见上文。你无法真正掌控这一点。 Windows和.NET提供了限制线程运行的核心的机制(即将“线程关联”设置为特定核心或核心组),但是您无法强制收集线程使用比.NET本来提供的更多的核心。

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

  
      
  1. 有些人建议使用ThreadPool。当我们使用线程池时实际发生了什么以及它是如何实际使用的?
  2.   

线程池是一种抽象线程集合的构造,每个线程都可以根据需要重用。这很有用,因为在创建线程时会有一些开销(特别是在Windows上......而不是在* nix操作系统上)。

.NET线程池开始为空(或者使用非常少量的线程)。当您为它排队时,它首先查找可用的空闲线程。如果有,则表示该线程执行您排队到线程池的委托。否则,它会创建一个新线程(如果某个线程池线程变为空闲并且可以重用,则可能先等待一小段时间),并使用该线程执行您的委托。

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

明确创建Thread对象时,

有关线程和.NET线程池的更详细信息,请参阅有关该主题的各种MSDN文档页面。对于StackOverflow问题,恕我直言的任何更多细节都会过于宽泛。