Hoo*_*ake 2 c# multithreading task-parallel-library
当你产生多个任务时,如下所示:
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();
}
Run Code Online (Sandbox Code Playgroud)
这些任务基本上是在ProcessThread上运行的.因此,我们可以为1,000,000个任务切割1个进程线程1,000,000次.
是TPL任务调度程序查看操作系统并确定我们在多核计算机中有8个虚拟进程线程,然后在这8个虚拟进程线程中分配1,000,000个任务的负载?
Nows任务基本上是在ProcessThread上运行的.因此我们可以为1000000个任务切片1个进程线程1000000次.
这不是真的.一个任务!=一个线程,特别是不等于ProcessThread.多个任务将被安排到一个线程上.
是TPL任务调度员查看操作系统并确定我们在多核计算机中有8个虚拟进程线程,因此在这8个虚拟进程线程中分配1000000个任务的负载?
实际上,是的.使用默认的TaskScheduler(您正在上面执行)时,任务在ThreadPool线程上运行.1000000个任务不会创建1000000个线程(虽然它会使用超过你提到的8个...)
话虽这么说,数据并行性(例如在一个巨大的for循环中循环)通常可以通过Parallel.For或Parallel.ForEach更好地处理.Parallel类将在内部使用a Partitioner<T>将工作分成更少的任务,这将为您提供更好的整体性能,因为它将具有更少的开销.有关更多详细信息,请参阅我在TPL中分区的帖子.
| 归档时间: |
|
| 查看次数: |
308 次 |
| 最近记录: |