.NET并行计算和并发11:并发接口 IProducerConsumerCollection
1 using System;
2 using System.Collections;
3 using System.Collections.Generic;
4 using System.Collections.Concurrent;
5 using System.Linq;
6 using System.Threading;
7 using System.Threading.Tasks;
8
9
10 // Sample implementation of IProducerConsumerCollection(T)
11 // -- in this case, a thread-safe stack.
12 public class SafeStack<T> : IProducerConsumerCollection<T>
13 {
14 // Used for enforcing thread-safety
15 private object m_lockObject = new object();
16
17 // We'll use a regular old Stack for our core operations
18 private Stack<T> m_sequentialStack = null;
19
20 //
21 // Constructors
22 //
23 public SafeStack()
24 {
25 m_sequentialStack = new Stack<T>();
26 }
27
28 public SafeStack(IEnumerable<T> collection)
29 {
30 m_sequentialStack = new Stack<T>(collection);
31 }
32
33 //
34 // Safe Push/Pop support
35 //
36 public void Push(T item)
37 {
38 lock (m_lockObject) m_sequentialStack.Push(item);
39 }
40
41 public bool TryPop(out T item)
42 {
43 bool rval = true;
44 lock (m_lockObject)
45 {
46 if (m_sequentialStack.Count == 0) { item = default(T); rval = false; }
47 else item = m_sequentialStack.Pop();
48 }
49 return rval;
50 }
51
52 //
53 // IProducerConsumerCollection(T) support
54 //
55 public bool TryTake(out T item)
56 {
57 return TryPop(out item);
58 }
59
60 public bool TryAdd(T item)
61 {
62 Push(item);
63 return true; // Push doesn't fail
64 }
65
66 public T[] ToArray()
67 {
68 T[] rval = null;
69 lock (m_lockObject) rval = m_sequentialStack.ToArray();
70 return rval;
71 }
72
73 public void CopyTo(T[] array, int index)
74 {
75 lock (m_lockObject) m_sequentialStack.CopyTo(array, index);
76 }
77
78
79
80 //
81 // Support for IEnumerable(T)
82 //
83 public IEnumerator<T> GetEnumerator()
84 {
85 // The performance here will be unfortunate for large stacks,
86 // but thread-safety is effectively implemented.
87 Stack<T> stackCopy = null;
88 lock (m_lockObject) stackCopy = new Stack<T>(m_sequentialStack);
89 return stackCopy.GetEnumerator();
90 }
91
92
93 //
94 // Support for IEnumerable
95 //
96 IEnumerator IEnumerable.GetEnumerator()
97 {
98 return ((IEnumerable<T>)this).GetEnumerator();
99 }
100
101 //
102 // Support for ICollection
103 //
104 public bool IsSynchronized
105 {
106 get { return true; }
107 }
108
109 public object SyncRoot
110 {
111 get { return m_lockObject; }
112 }
113
114 public int Count
115 {
116 get { return m_sequentialStack.Count; }
117 }
118
119 public void CopyTo(Array array, int index)
120 {
121 lock (m_lockObject) ((ICollection)m_sequentialStack).CopyTo(array, index);
122 }
123 }
124
125 public class Program
126 {
127 static void Main()
128 {
129 TestSafeStack();
130
131 // Keep the console window open in debug mode.
132 Console.WriteLine("Press any key to exit.");
133 Console.ReadKey();
134 }
135
136 // Test our implementation of IProducerConsumerCollection(T)
137 // Demonstrates:
138 // IPCC(T).TryAdd()
139 // IPCC(T).TryTake()
140 // IPCC(T).CopyTo()
141 static void TestSafeStack()
142 {
143 SafeStack<int> stack = new SafeStack<int>();
144 IProducerConsumerCollection<int> ipcc = (IProducerConsumerCollection<int>)stack;
145
146 // Test Push()/TryAdd()
147 stack.Push(10); Console.WriteLine("Pushed 10");
148 ipcc.TryAdd(20); Console.WriteLine("IPCC.TryAdded 20");
149 stack.Push(15); Console.WriteLine("Pushed 15");
150
151 int[] testArray = new int[3];
152
153 // Try CopyTo() within boundaries
154 try
155 {
156 ipcc.CopyTo(testArray, 0);
157 Console.WriteLine("CopyTo() within boundaries worked, as expected");
158 }
159 catch (Exception e)
160 {
161 Console.WriteLine("CopyTo() within boundaries unexpectedly threw an exception: {0}", e.Message);
162 }
163
164 // Try CopyTo() that overflows
165 try
166 {
167 ipcc.CopyTo(testArray, 1);
168 Console.WriteLine("CopyTo() with index overflow worked, and it SHOULD NOT HAVE");
169 }
170 catch (Exception e)
171 {
172 Console.WriteLine("CopyTo() with index overflow threw an exception, as expected: {0}", e.Message);
173 }
174
175 // Test enumeration
176 Console.Write("Enumeration (should be three items): ");
177 foreach (int item in stack) Console.Write("{0} ", item);
178 Console.WriteLine("");
179
180 // Test TryPop()
181 int popped = 0;
182 if (stack.TryPop(out popped))
183 {
184 Console.WriteLine("Successfully popped {0}", popped);
185 }
186 else Console.WriteLine("FAILED to pop!!");
187
188 // Test Count
189 Console.WriteLine("stack count is {0}, should be 2", stack.Count);
190
191 // Test TryTake()
192 if (ipcc.TryTake(out popped))
193 {
194 Console.WriteLine("Successfully IPCC-TryTaked {0}", popped);
195 }
196 else Console.WriteLine("FAILED to IPCC.TryTake!!");
197 }
198 }
199
.NET并行计算和并发11:并发接口 IProducerConsumerCollection的更多相关文章
- C++11 并发编程库
C++11 并发编程 C++11 新标准中引入了几个头文件来支持多线程编程,他们分别是: <atomic>:该头文主要声明了两个类, std::atomic 和 std::atomic_f ...
- C++11 并发指南后续更新
C++11 并发指南的第一篇是 2013 年 8 月 3 号写的,到今天(2013 年 8 月 31 号)差不多一个月了,前前后后共写了 6 章(目前共 8 篇)博客介绍 C++11 的并发编程,但还 ...
- C++11 并发指南系列
本系列文章主要介绍 C++11 并发编程,计划分为 9 章介绍 C++11 的并发和多线程编程,分别如下: C++11 并发指南一(C++11 多线程初探)(本章计划 1-2 篇,已完成 1 篇) C ...
- C++11 并发指南三(Lock 详解)
在 <C++11 并发指南三(std::mutex 详解)>一文中我们主要介绍了 C++11 标准中的互斥量(Mutex),并简单介绍了一下两种锁类型.本节将详细介绍一下 C++11 标准 ...
- C++11 并发指南六(atomic 类型详解四 C 风格原子操作介绍)
前面三篇文章<C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍)>.<C++11 并发指南六( <atomic> 类型详解二 std::at ...
- C++11 并发指南六(atomic 类型详解三 std::atomic (续))
C++11 并发指南六( <atomic> 类型详解二 std::atomic ) 介绍了基本的原子类型 std::atomic 的用法,本节我会给大家介绍C++11 标准库中的 std: ...
- C++11 并发指南六( <atomic> 类型详解二 std::atomic )
C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍) 一文介绍了 C++11 中最简单的原子类型 std::atomic_flag,但是 std::atomic_flag ...
- C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍)
C++11 并发指南已经写了 5 章,前五章重点介绍了多线程编程方面的内容,但大部分内容只涉及多线程.互斥量.条件变量和异步编程相关的 API,C++11 程序员完全可以不必知道这些 API 在底层是 ...
- C++11 并发指南五(std::condition_variable 详解)
前面三讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三(std::mutex 详解)>分别介绍了 std::thread,std::mut ...
- C++11并发内存模型学习
C++11标准已发布多年,编译器支持也逐渐完善,例如ms平台上从vc2008 tr1到vc2013.新标准对C++改进体现在三方面:1.语言特性(auto,右值,lambda,foreach):2.标 ...
随机推荐
- LINQ to Entities 不识别方法“System.DateTime AddDays(Double)
今天本想在linq里按照时间筛选一下超时的数据,一共两个字段FeedBackTime(计划反馈时间).EndTime(实际反馈时间).需求是这样的,查找数据库里所有EndTime大于FeedBackT ...
- Rails6新增rails db:system:change更换数据库
rails db:system:change --to=postgresql rails db:system:change --to=mysql rails db:system:change --to ...
- SpringBoot整合Mybatis注解版---update出现org.apache.ibatis.binding.BindingException: Parameter 'XXX' not found. Available parameters are [arg1, arg0, param1, param2]
SpringBoot整合Mybatis注解版---update时出现的问题 问题描述: 1.sql建表语句 DROP TABLE IF EXISTS `department`; CREATE TABL ...
- [ZJOI2019]麻将
这是一道麻将自动机的模板题(雾 其实这是一道dp套dp借助自动机实现的麻将好题! 首先把期望转化一下,拆成sigema p(x>i) 现在要计算i张牌不胡的概率,也就等价于计算i张牌不胡的方案数 ...
- 菜鸡学C语言之真心话大冒险
题目描述 Leslie非常喜欢真心话大冒险的游戏.这一次游戏的规则有些不同.每个人都有自己的真心话,一开始每个人也都只知道自己的真心话.每一轮每个人都告诉指定的一个人他所知道的所有真心话,那么Lesl ...
- jquery 判断浏览器版本
如果你也是Jquery最初的使用者,那么你一定经历过这样判断浏览器的时代:$.browser.msie && $.browser.version,你目前使用的组件里可能还有应用.但是J ...
- linux服务器上使用find查杀webshell木马方法
本文转自:http://ju.outofmemory.cn/entry/256317 只要从事互联网web开发的,都会碰上web站点被入侵的情况.这里我把查杀的一些方法采用随记的形式记录一下,一是方便 ...
- 3DsMax 自动化操作(maxScript)
这是我编写的一部分maxScript 脚本,专注于3DsMax 快速建模,程序化地为我们完成一些繁琐的工作. 可以极大提高公司开发的效率! 2019年04月09日 :上传 今年新开发的插件,还有很多, ...
- python修炼第五天
第五天,感觉开始烧脑了.递归逻辑难,模块数量多,但是绝世武功都是十年磨一剑出来的!稳住! 1 递归. 定义-----递归就是在函数的内部调用自己递归深度 998不建议修改递归深度,因为如果998都没有 ...
- mybatis Interceptor拦截器代码详解
mybatis官方定义:MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...