gpt4 book ai didi

c# - 并行编程 TPL

转载 作者:行者123 更新时间:2023-11-30 20:07:28 29 4
gpt4 key购买 nike

当你生成多个任务时,像这样:

 for (int i = 0; i < 1000000; i++) {
// create a new task
tasks[i] = new Task<int>((stateObject) => {
tls.Value = (int)stateObject;

for (int j = 0; j < 1000; j++) {
// update the TLS balance
tls.Value++;
}

return tls.Value;
}, account.Balance);

tasks[i].Start();
}

这些任务基本上是在 ProcessThread 上运行的。因此,我们可以为 1,000,000 个任务将 1 个进程线程切片 1,000,000 次。

是不是 TPL 任务调度程序查看操作系统并确定我们在多核机器中有 8 个虚拟进程线程,然后在这 8 个虚拟进程线程之间分配 1,000,000 个任务的负载?

最佳答案

Nows tasks are basically operating on a ProcessThread..so therefore we can slice 1 process thread 1000000 times for 1000000 tasks.

这不是真的。任务!= 线程,尤其不等同于 ProcessThread .多个任务将被安排到一个线程上。

Is it the TPL task schduler that looks at the OS and determines that we have 8 virtual Process threads in a multicore machine, and so therefore allocates the load of 1000000 tasks across these 8 vgirtual process threads ?

有效,是的。使用默认的 TaskScheduler(您在上面执行的操作)时,任务在 ThreadPool 线程上运行。 1000000 个任务不会创建 1000000 个线程(尽管它会使用超过你提到的 8 个...)

也就是说,数据并行性(例如在一个巨大的 for 循环中循环)通常通过 Parallel.For 处理得更好。或 Parallel.ForEach . Parallel 类将在内部使用 Partitioner<T> 。将工作分成更少的任务,这会给你更好的整体性能,因为它的开销要少得多。有关详细信息,请参阅我在 Partitioning in the TPL 上的帖子.

关于c# - 并行编程 TPL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8391929/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com