Parallel.For实现
static class MyParallel
{ //4.0及以上用Task, Task的背后的实现也是使用了线程池线程
//static List<Task> tasks = new List<Task>(); //4.0以下用Thread
static List<Thread> tasks = new List<Thread>(); //队列
static Queue<int[]> datas = new Queue<int[]>();
public static void For(int start, int end, Action<int> action)
{
//逻辑处理器数量
var taskAllCount = Environment.ProcessorCount*2; #region 每次处理的量
int pageSize = end / taskAllCount;
if (pageSize == 0)
{
pageSize = 1;
}
#endregion #region 分配处理范围 var totalCount = end;
for (int pageIndex = 0; totalCount >= 0; pageIndex++)
{
int pageStart = pageIndex * pageSize;
int pageEnd = pageIndex * pageSize + pageSize; datas.Enqueue(new int[] { pageStart, pageEnd }); //入队
totalCount -= pageSize;
} #endregion #region 根据逻辑处理器数量创建任务,并启动 int i = 0;
while (tasks.Count < taskAllCount)
{
tasks.Add(new Thread(() =>
{
while (datas.Count > 0)
{
var one = new int[] { end, end }; lock (datas)
{
one = datas.Dequeue();
}
for (int j = one.First(); j < end && j < one.Last(); j++)
{
action(j);
} System.Threading.Thread.Sleep(10);
}
}));
tasks[i].IsBackground = true;
tasks[i].Start();
i++;
}
#endregion //等待所有任务结束
foreach (var task in tasks)
{
task.Join();
task.Abort();
}
tasks.Clear();
//Task.WaitAll(tasks.ToArray());
}
}
Parallel.For实现的更多相关文章
- .Net多线程编程—System.Threading.Tasks.Parallel
System.Threading.Tasks.Parallel类提供了Parallel.Invoke,Parallel.For,Parallel.ForEach这三个静态方法. 1 Parallel. ...
- Java 8函数编程轻松入门(五)并行化(parallel)
1.并发与并行的区别 并发: 一个时间段内有几个程序都处于已启动到运行完毕之间,且这几个程序都是在同一个处理机上运行.但在任一个时刻点只有一个程序在处理机上运行 并行: 在同一个时刻,多核处理多个任务 ...
- Parallel并行之乱用
关于Parallel我也不细说了,一则微软封装的很好用,二来介绍这个的遍地都是. 我要说的是,要想成为一个优秀的标题党,一定要把重点放到别的地方,为了节省大家阅读时间,我先把结论说了,然后再慢慢从头说 ...
- 代码的坏味道(12)——平行继承体系(Parallel Inheritance Hierarchies)
坏味道--平行继承体系(Parallel Inheritance Hierarchies) 平行继承体系(Parallel Inheritance Hierarchies) 其实是 霰弹式修改(Sho ...
- 多线程之任务: Task 基础, 多任务并行执行, 并行运算(Parallel)
Task - 基于线程池的任务(在 System.Threading.Tasks 命名空间下) 多 Task 的并行执行 Parallel - 并行计算(在 System.Threading.Task ...
- Parallel.Foreach
随着多核时代的到来,并行开发越来越展示出它的强大威力! 使用并行程序,充分的利用系统资源,提高程序的性能.在.net 4.0中,微软给我们提供了一个新的命名空间:System.Threading.Ta ...
- 在Parallel中使用DbSet.Add()发现的一系列多线程问题和解决过程
发现问题 需求很简单,大致就是要批量往数据库写数据,于是打算用Parallel并行的方式写入,希望能利用计算机多核特性加快程序执行速度.想的很美好,于是快速撸了类似下面的一串代码: using (va ...
- Intel.parallel.studio.xe.2015.Update.2.ISO-TBE 下载
磁力链下载点我 还有linux版本 Intel.parallel.studio.xe.2015.Update.1.LINUX.ISO-TBE 收集自网络,要跨请跨原作者,谢谢.
- Parallel并行编程初步
Parallel并行编程可以让我们使用极致的使用CPU.并行编程与多线程编程不同,多线程编程无论怎样开启线程,也是在同一个CPU上切换时间片.而并行编程则是多CPU核心同时工作.耗时的CPU计算操作选 ...
- C#~异步编程再续~大叔所理解的并行编程(Task&Parallel)
返回目录 并行这个概念出自.net4.5,它被封装在System.Threading.Tasks命名空间里,主要提供一些线程,异步的方法,或者说它是对之前Thread进行的二次封装,为的是让开发人员更 ...
随机推荐
- 用 Go 实现一个 LRU cache
前言 早在几年前写过关于 LRU cache 的文章: https://crossoverjie.top/2018/04/07/algorithm/LRU-cache/ 当时是用 Java 实现的,最 ...
- Python3的数据类型
不可变类型:Number(数值,包含Bool类型).String(字符串).Tuple(元组) 可变类型:List(列表).Dict(字典).Set(集合) Bool不再单独存在,属于Number数值 ...
- LuoguB2044 有一门课不及格的学生 题解
Content 给出一名学生的语数英三门成绩,请判断该名学生是否恰好有一门不及格(成绩小于 \(60\) 分). 数据范围:成绩在 \(0\sim 100\) 之间. Solution 强烈建议先去做 ...
- MAVEN基础讲解
MAVEN解决的问题 1.当我们开始一个工程的时候往往需要几十甚至上百个jar包,如果没有一个管理工具的话,结果就是每个都需要自己手动导入工程目录,并且还有可能发生jar包冲突,版本冲突等问题 2.在 ...
- 【LeetCode】968. Binary Tree Cameras 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】435. Non-overlapping Intervals 解题报告(Python)
[LeetCode]435. Non-overlapping Intervals 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemi ...
- 魔法串(hud4545)
魔法串 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submiss ...
- 修改gorm支持protobuf
gorm的功能很强大,支持很多很多特性,打算在项目中用上它. 但gorm不支持protobuf,如果idl用的是protobuf,需要对每个message做一个重新定义一个内部的struct,使得可以 ...
- ZOJ 1141:Closest Common Ancestors(LCA)
Closest Common Ancestors Time Limit: 10 Seconds Memory Limit: 32768 KB Write a program that tak ...
- 【嵌入式】keil不识别野火高速dap的问题
解决方法:https://www.firebbs.cn/thread-28093-1-1.html