相关疑难解决方法(0)

多核用法,线程,线程池

我对多线程编程和多核使用有一些疑问.

特别是我想知道操作系统和/或框架(这是.NET)如何处理大量使用的核心.

这是关于线程的问题:

  • 当产生新线程时,将线程分配给特定核心的算法是什么?
    1. 循环型算法
    2. 随机
    3. 目前使用最少的核心
  • 如果不是当前最少使用的核心,那么确定这种类型的代码是否会使线程的典型使用相形见绌,从而使事情变得更糟?
  • 线程在生命周期内是否从一个核心移动到另一个核心?如果是这样,这是否会处理由于某种原因"过度使用"的内核,因此操作系统会尝试将线程混洗到较少使用的内核以帮助系统?如果不是,为什么不呢?

我的最后一个问题,基本上是上面的重用,是关于.NET ThreadPool类,它处理诸如.BeginInvoke之类的东西.这堂课有没有做过这些?如果没有,为什么不,或者应该呢?

有没有办法调整这个处理,在操作系统上提示这个特定的线程,当你为它分配一个核心时请多关注它,因为我知道它会使用很多cpu.那会有意义吗?或者"很多cpu"只是相对的,因此不够好?

.net multithreading multicore

9
推荐指数
2
解决办法
3914
查看次数

强制任务<T>到不同的核心?

TplPlinq 自动将工作分配给线程(在core/s ... { 好吧,如果 #threads> #cores那么,> 1个线程将在同一个核心上运行. }).

但是,让我们说我已经 MyMethod1(){..}并且MyMethod2(){..}我需要确保(!)每个都将在不同的核心上运行!(例如密集计算)

我找到的最近的解决方案是Plinq .WithExecutionMode (ParallelExecutionMode.ForceParallelism)

但这是针对一种不同的情况,Plinq可能会认为按顺序而不是并行执行它更好.另外,我不使用Plinq.我只有2种方法需要在不同的核心上运行.

我该怎么做 ?

ps这里有一个答案,建议使用,TaskCreationOptions.LongRunning但它只是暗示TaskScheduler它应该更积极地创建线程池线程.但这些线程可以在同一个核心上.我的情况要求他们处于不同的核心.

谢谢.

c# multithreading .net-4.0 task task-parallel-library

2
推荐指数
1
解决办法
2058
查看次数