在C#中,我想做多线程说我有线程T1和线程T2。我这样做:
Thread T1 = new Thead(some_func).Start()
Thread T2 = new Thread(some_other_func).Start().
通过这样做,我会在核心或单核心中产生线程。如果它是单核,我怎么能跨核心做。有内置方法吗?或者我必须明确地做到这一点?有人建议使用ThreadPool。当我们使用线程池时实际发生了什么以及它是如何实际使用的?
答案 0 :(得分:0)
一些快速回答:
- 通过这样做,我会在核心或单核心中产生线程吗?
醇>
您正在创建多个线程。它们是否在不同的内核上执行完全取决于框架和(因为.NET通常将作业委派给操作系统)操作系统。但是,如果核心可用,则通常会使用它们。
- 如果它是单核,我怎么能跨核心。
- 有内置方法吗?或者我必须明确地做到这一点?。
醇>
见上文。你无法真正掌控这一点。 Windows和.NET提供了限制线程运行的核心的机制(即将“线程关联”设置为特定核心或核心组),但是您无法强制收集线程使用比.NET本来提供的更多的核心。
幸运的是,正如我上面提到的,.NET通常会使用尽可能多的内核。
- 有些人建议使用ThreadPool。当我们使用线程池时实际发生了什么以及它是如何实际使用的?
醇>
线程池是一种抽象线程集合的构造,每个线程都可以根据需要重用。这很有用,因为在创建线程时会有一些开销(特别是在Windows上......而不是在* nix操作系统上)。
.NET线程池开始为空(或者使用非常少量的线程)。当您为它排队时,它首先查找可用的空闲线程。如果有,则表示该线程执行您排队到线程池的委托。否则,它会创建一个新线程(如果某个线程池线程变为空闲并且可以重用,则可能先等待一小段时间),并使用该线程执行您的委托。
.NET ThreadPool
类封装了这种行为。请注意,线程池由许多机制使用,包括委托的直接异步调用(即每个委托类型具有的BeginInvoke()
方法),框架中的各种异步API以及使用该方法启动的某些类型的异步操作。 Task
上课。
明确创建Thread
对象时,不。
有关线程和.NET线程池的更详细信息,请参阅有关该主题的各种MSDN文档页面。对于StackOverflow问题,恕我直言的任何更多细节都会过于宽泛。