Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 并行编程:创建一定数量的进程和相关数据/工作_C#_Multithreading_Parallel Processing_Task Parallel Library_Multiprocessing - Fatal编程技术网

C# 并行编程:创建一定数量的进程和相关数据/工作

C# 并行编程:创建一定数量的进程和相关数据/工作,c#,multithreading,parallel-processing,task-parallel-library,multiprocessing,C#,Multithreading,Parallel Processing,Task Parallel Library,Multiprocessing,我需要根据用户PC的逻辑核数量,在不同的进程上分配工作负载。 工作负载由以下代码完成: static void work() { WorkData myData = new WorkData(); Worker myWorker = new Worker(myData); MyWorker.doWork() } 我使用此代码计算逻辑核数: int nbProcessors = 1; foreach (var item in new System.Management.M

我需要根据用户PC的逻辑核数量,在不同的进程上分配工作负载。 工作负载由以下代码完成:

static void work()
{
    WorkData myData = new WorkData();
    Worker myWorker = new Worker(myData);
    MyWorker.doWork()
}
我使用此代码计算逻辑核数:

int nbProcessors = 1;
foreach (var item in new System.Management.ManagementObjectSearcher("Select *  from Win32_ComputerSystem").Get())
{
    nbProcessors = Convert.ToInt32(item["NumberOfLogicalProcessors"]);
}
现在,我必须在逻辑核上共享工作,从而完成10000次我的工作(),因此在我的pc机上,这意味着启动8个进程,每个进程1250次迭代。 我还需要每个进程都有自己的数据,这样就不会产生冲突

我该怎么做呢?

看看:

它将在内核之间自动拆分。但是如果需要,您可以手动设置线程数

我认为您应该查看方法和方法。
这两个类都依赖于当前的工作站配置,因此您可以轻松地在任务中使用它们

并行使用示例:

:

:

评论更新:

(Parralel类)在内部使用Threading.Tasks命名空间,其中一些进程管理:

线程池上线程的调度

另外两个链接关于:和。我认为第二个链接可以帮助您平衡数据的工作

如果可能,如果工作负载变得不平衡,调度程序会在多个线程和处理器之间重新分配工作


嗯,您知道可以通过访问属性获取逻辑处理器计数:

Environment.ProcessorCount
在我的四核HT机器上返回8-有点像签出

如果您有固定的迭代次数(而不是对列表或其他内容进行迭代) 然后你可以选择:

var parallelOptions = new ParallelOptions
{
    MaxDegreeOfParallelistm = Environment.ProcessorCount
};


//edited per comment
Parallel.For(0, 10000, parallelOptions, () =>
{
    WorkData myData = new WorkData();
    Worker myWorker = new Worker(myData);
    MyWorker.doWork() 
});
如果必须对列表进行一些分区,那么partitioner将发挥作用:

var partitioner = Partitioner.Create(yourList);
var parallelOptions = new ParallelOptions
{
    MaxDegreeOfParallelism = Environment.ProcessorCount
};

Parallel.ForEach(partitioner, parallelOptions, (listItem, loopState) =>
{
   //Do something
}
尽管请注意,默认情况下,
并行
循环产生的线程数量与内核数量相同。

由于可以使用C#4.0,它会自动进行负载平衡:

Parallel.For(0, 10000, p => work());

请参阅:

查看线程指南。
以非常容易理解的方式从非常基本的线程到并行编程。
简而言之,这是c#4.0一书中的5章。

就我个人而言,这对我更好地理解线程有很大帮助。

有什么原因你不能使用
Parallel.ForAll()
?如果我没弄错,那就是Parallel。因为线程池只是在一个进程中进行多线程处理,不是吗?事实上,如果我使用iterationspecore=10000/Environment.ProcessorCount;PParallel.For(0,iterationsPerCore…它在8个核心之间共享1250个迭代
var parallelOptions = new ParallelOptions
{
    MaxDegreeOfParallelistm = Environment.ProcessorCount
};


//edited per comment
Parallel.For(0, 10000, parallelOptions, () =>
{
    WorkData myData = new WorkData();
    Worker myWorker = new Worker(myData);
    MyWorker.doWork() 
});
var partitioner = Partitioner.Create(yourList);
var parallelOptions = new ParallelOptions
{
    MaxDegreeOfParallelism = Environment.ProcessorCount
};

Parallel.ForEach(partitioner, parallelOptions, (listItem, loopState) =>
{
   //Do something
}
Parallel.For(0, 10000, p => work());
ParallelEnumerable.Range(0, 10000).ForAll(p => work());