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());
}
}

性能测试

            var list = new List<int>(1000);
for (int i = 0; i < 1000; i++)
{
list.Add(i);
}
string startTime = DateTime.Now.ToString(); int ii = 0;
MyParallel.For(0, list.Count, x =>
{
Thread.Sleep(10);
Console.WriteLine($"{x.ToString()},{ Interlocked.Increment(ref ii)}");
});
Console.WriteLine("Parallel.For " + startTime + "," + DateTime.Now); Console.ReadKey();
startTime = DateTime.Now.ToString();
foreach (var item in list)
{
Thread.Sleep(10);
Console.WriteLine(item.ToString());
}
Console.WriteLine("for" + startTime + "," + DateTime.Now); Console.ReadKey();

C# 实现Parallel.For的更多相关文章

  1. .Net多线程编程—System.Threading.Tasks.Parallel

    System.Threading.Tasks.Parallel类提供了Parallel.Invoke,Parallel.For,Parallel.ForEach这三个静态方法. 1 Parallel. ...

  2. Java 8函数编程轻松入门(五)并行化(parallel)

    1.并发与并行的区别 并发: 一个时间段内有几个程序都处于已启动到运行完毕之间,且这几个程序都是在同一个处理机上运行.但在任一个时刻点只有一个程序在处理机上运行 并行: 在同一个时刻,多核处理多个任务 ...

  3. Parallel并行之乱用

    关于Parallel我也不细说了,一则微软封装的很好用,二来介绍这个的遍地都是. 我要说的是,要想成为一个优秀的标题党,一定要把重点放到别的地方,为了节省大家阅读时间,我先把结论说了,然后再慢慢从头说 ...

  4. 代码的坏味道(12)——平行继承体系(Parallel Inheritance Hierarchies)

    坏味道--平行继承体系(Parallel Inheritance Hierarchies) 平行继承体系(Parallel Inheritance Hierarchies) 其实是 霰弹式修改(Sho ...

  5. 多线程之任务: Task 基础, 多任务并行执行, 并行运算(Parallel)

    Task - 基于线程池的任务(在 System.Threading.Tasks 命名空间下) 多 Task 的并行执行 Parallel - 并行计算(在 System.Threading.Task ...

  6. Parallel.Foreach

    随着多核时代的到来,并行开发越来越展示出它的强大威力! 使用并行程序,充分的利用系统资源,提高程序的性能.在.net 4.0中,微软给我们提供了一个新的命名空间:System.Threading.Ta ...

  7. 在Parallel中使用DbSet.Add()发现的一系列多线程问题和解决过程

    发现问题 需求很简单,大致就是要批量往数据库写数据,于是打算用Parallel并行的方式写入,希望能利用计算机多核特性加快程序执行速度.想的很美好,于是快速撸了类似下面的一串代码: using (va ...

  8. Intel.parallel.studio.xe.2015.Update.2.ISO-TBE 下载

    磁力链下载点我 还有linux版本 Intel.parallel.studio.xe.2015.Update.1.LINUX.ISO-TBE 收集自网络,要跨请跨原作者,谢谢.

  9. Parallel并行编程初步

    Parallel并行编程可以让我们使用极致的使用CPU.并行编程与多线程编程不同,多线程编程无论怎样开启线程,也是在同一个CPU上切换时间片.而并行编程则是多CPU核心同时工作.耗时的CPU计算操作选 ...

  10. C#~异步编程再续~大叔所理解的并行编程(Task&Parallel)

    返回目录 并行这个概念出自.net4.5,它被封装在System.Threading.Tasks命名空间里,主要提供一些线程,异步的方法,或者说它是对之前Thread进行的二次封装,为的是让开发人员更 ...

随机推荐

  1. 『学了就忘』Linux系统定时任务 — 87、只执行一次的定时任务

    目录 1.at服务管理 2.at命令的访问控制 3.at命令 4.其他at管理命令 5.总结 定时任务是在服务器上常用到的一个工作. 在你指定的时间,系统会自动执行你指定的程序(脚本或者命令). Li ...

  2. CF1433B Yet Another Bookshelf 题解

    Content 在一个仅有 \(0,1\) 这两个数的数列上,每次可以选择一段全为1的连续区间将其左移 \(1\) 或者右移 \(1\).现给出 \(t\) 次询问,每次询问给出一个长度为 \(n\) ...

  3. Java面向对象之 接口: [修饰符] interface 接口名 {...};子接口:[修饰符] interface 接口名 extends 父接口,父接口2...{...}

    1.什么是接口? 类比抽象类,把功能或者特性类似的一类 抽象的更彻底,可以提炼出更加特殊的"抽象类"----接口 2.如何定义接口 语法:  [修饰符] interface 接口名 ...

  4. Shell之Sed常用用法

    匹配某字符串开头的行,整行替换 文本原内容 目的: SELINUX= 整行替换为SELINUX=disabled # grep -Ev '^$|^#' /etc/selinux/config SELI ...

  5. 使用.NET 6开发TodoList应用(6)——使用MediatR实现POST请求

    需求 需求很简单:如何创建新的TodoList和TodoItem并持久化. 初学者按照教程去实现的话,应该分成以下几步:创建Controller并实现POST方法:实用传入的请求参数new一个数据库实 ...

  6. c/c++11封装UDP,支持ipv4和ipv6,支持接收和发送

    更新日志 11/06/2021 1.增加IPV6 2.ipv6通过windows10初步测试 3.ipv6包括: 接收和发送 5.增加错误代码接口 6.本机IPv6截图 7.编译通过截图 8.ipv6 ...

  7. 【LeetCode】829. Consecutive Numbers Sum 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数学方法 日期 题目地址:https://leetc ...

  8. 【LeetCode】894. All Possible Full Binary Trees 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  9. LightOJ - 1003 Drunk

    One of my friends is always drunk. So, sometimes I get a bit confused whether he is drunk or not. So ...

  10. 2019HPU-ICPC-Training-1

    byl太强了,学弟们太强了-全程被吊打,嘤嘤嘤- A题  Connecting Vertices http://codeforces.com/problemset/problem/888/F 不会 B ...