C#并行编程-并发集合
2014-08-27 14:52
281 查看
菜鸟学习并行编程,参考《C#并行编程高级教程.PDF》,如有错误,欢迎指正。
C#并行编程-Parallel
C#并行编程-Task
C#并行编程-并发集合
C#并行编程-线程同步原语
C#并行编程-PLINQ:声明式数据并行
背景
基于任务的程序设计、命令式数据并行和任务并行都要求能够支持并发更新的数组、列表和集合。
在.NET Framework 4 以前,为了让共享的数组、列表和集合能够被多个线程更新,需要添加复杂的代码来同步这些更新操作。
如您需要编写一个并行循环,这个循环以无序的方式向一个共享集合中添加元素,那么必须加入一个同步机制来保证这是一个线程安全的集合。
System.Collenctions和System.Collenctions.Generic 名称空间中所提供的经典列表、集合和数组的线程都不是安全的,不能接受并发请求,因此需要对相应的操作方法执行串行化。
下面看代码,代码中并没有实现线程安全和串行化:
View Code
对于并发下的其他集合,我这边就不做代码案列了,大家可以通过下面的链接查看,如有问题,欢迎指正
http://msdn.microsoft.com/zh-cn/library/system.collections.concurrent(v=vs.110).aspx
作者:释迦苦僧 出处:/article/5294248.html
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
目录
C#并行编程-相关概念C#并行编程-Parallel
C#并行编程-Task
C#并行编程-并发集合
C#并行编程-线程同步原语
C#并行编程-PLINQ:声明式数据并行
背景
基于任务的程序设计、命令式数据并行和任务并行都要求能够支持并发更新的数组、列表和集合。
在.NET Framework 4 以前,为了让共享的数组、列表和集合能够被多个线程更新,需要添加复杂的代码来同步这些更新操作。
如您需要编写一个并行循环,这个循环以无序的方式向一个共享集合中添加元素,那么必须加入一个同步机制来保证这是一个线程安全的集合。
System.Collenctions和System.Collenctions.Generic 名称空间中所提供的经典列表、集合和数组的线程都不是安全的,不能接受并发请求,因此需要对相应的操作方法执行串行化。
下面看代码,代码中并没有实现线程安全和串行化:
class Program { private static object o = new object(); private static ConcurrentStack<Product> _ConcurrenProducts { get; set; } /* coder:释迦苦僧 * ConcurrentQueue 下的 TryPeek 和 TryPop */ static void Main(string[] args) { _ConcurrenProducts = new ConcurrentStack<Product>(); /*执行添加操作*/ Console.WriteLine("执行添加操作"); Parallel.Invoke(AddConcurrenProducts, AddConcurrenProducts); Console.WriteLine("ConcurrentStack<Product> 当前数据量为:" + _ConcurrenProducts.Count); /*执行TryPeek操作 尝试返回不移除*/ Console.WriteLine("执行TryPeek操作 尝试返回不移除"); Parallel.Invoke(PeekConcurrenProducts, PeekConcurrenProducts); Console.WriteLine("ConcurrentStack<Product> 当前数据量为:" + _ConcurrenProducts.Count); /*执行TryDequeue操作 尝试返回并移除*/ Console.WriteLine("执行TryPop操作 尝试返回并移除"); Parallel.Invoke(PopConcurrenProducts, PopConcurrenProducts); Console.WriteLine("ConcurrentStack<Product> 当前数据量为:" + _ConcurrenProducts.Count); Console.ReadLine(); } /*执行集合数据添加操作*/ static void AddConcurrenProducts() { Parallel.For(0, 100, (i) => { Product product = new Product(); product.Name = "name" + i; product.Category = "Category" + i; product.SellPrice = i; _ConcurrenProducts.Push(product); }); } /*尝试返回 但不移除*/ static void PeekConcurrenProducts() { Parallel.For(0, 2, (i) => { Product product = null; bool excute = _ConcurrenProducts.TryPeek(out product); Console.WriteLine(product.Name); }); } /*尝试返回 并 移除*/ static void PopConcurrenProducts() { Parallel.For(0, 2, (i) => { Product product = null; bool excute = _ConcurrenProducts.TryPop(out product); Console.WriteLine(product.Name); }); } } class Product { public string Name { get; set; } public string Category { get; set; } public int SellPrice { get; set; } }
View Code
对于并发下的其他集合,我这边就不做代码案列了,大家可以通过下面的链接查看,如有问题,欢迎指正
http://msdn.microsoft.com/zh-cn/library/system.collections.concurrent(v=vs.110).aspx
作者:释迦苦僧 出处:/article/5294248.html
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
相关文章推荐
- C#并行编程-并发集合
- C# 并行编程 之 并发集合 (.Net Framework 4.0)
- C# 并行编程 之 并发集合 (.Net Framework 4.0)
- C# 并行编程 之 并发集合 (.Net Framework 4.0)(转)
- C#并行编程-并发集合 - 释迦苦僧 - 博客园
- C#并行编程-并发集合
- C#并行编程-并发集合
- C# 并行编程 之 Barrier的使用 - 通过屏障同步并发任务
- C# 并行编程 之 限制资源的并发访问 使用SemaphoreSlim
- 使用C#和.NET 4编写的并行应用程序“多核并发编程的规则”
- 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq
- C# 并行编程 之 Barrier的使用 - 通过屏障同步并发任务
- C#编程(五十八)----------并行集合
- 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq
- 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq
- C#并发编程(二)-动态并行和并行聚合
- 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq
- 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq
- C# 并行编程 之 Barrier的使用 - 通过屏障同步并发任务
- C#并行编程-Parallel