Mercurial > pub > ImplabNet
comparison Implab.Test/AsyncTests.cs @ 14:e943453e5039 promises
Implemented interllocked queue
fixed promise syncronization
author | cin |
---|---|
date | Wed, 06 Nov 2013 17:49:12 +0400 |
parents | b0feb5b9ad1c |
children | 0f982f9b7d4d |
comparison
equal
deleted
inserted
replaced
13:b0feb5b9ad1c | 14:e943453e5039 |
---|---|
132 pool | 132 pool |
133 .Invoke(() => 1) | 133 .Invoke(() => 1) |
134 .Then(x => Interlocked.Add(ref count, x)); | 134 .Then(x => Interlocked.Add(ref count, x)); |
135 | 135 |
136 Assert.AreEqual(1000, count); | 136 Assert.AreEqual(1000, count); |
137 } | |
138 | |
139 [TestMethod] | |
140 public void MTQueueTest() { | |
141 var queue = new MTQueue<int>(); | |
142 var pool = new WorkerPool(5, 20); | |
143 | |
144 int res; | |
145 | |
146 queue.Enqueue(10); | |
147 Assert.IsTrue(queue.TryDequeue(out res)); | |
148 Assert.AreEqual(10, res); | |
149 Assert.IsFalse(queue.TryDequeue(out res)); | |
150 | |
151 for (int i = 0; i < 1000; i++) | |
152 queue.Enqueue(i); | |
153 | |
154 for (int i = 0; i < 1000; i++) { | |
155 queue.TryDequeue(out res); | |
156 Assert.AreEqual(i, res); | |
157 } | |
158 | |
159 int writers = 0; | |
160 int readers = 0; | |
161 var stop = new ManualResetEvent(false); | |
162 int total = 0; | |
163 | |
164 int itemsPerWriter = 1000; | |
165 int writersCount = 3; | |
166 | |
167 for (int i = 0; i < writersCount; i++) { | |
168 Interlocked.Increment(ref writers); | |
169 var wn = i; | |
170 AsyncPool | |
171 .InvokeNewThread(() => { | |
172 Console.WriteLine("Started writer: {0}", wn); | |
173 for (int ii = 0; ii < itemsPerWriter; ii++) { | |
174 queue.Enqueue(1); | |
175 Thread.Sleep(1); | |
176 } | |
177 Console.WriteLine("Stopped writer: {0}", wn); | |
178 return 1; | |
179 }) | |
180 .Then(x => Interlocked.Decrement(ref writers) ); | |
181 } | |
182 | |
183 for (int i = 0; i < 10; i++) { | |
184 Interlocked.Increment(ref readers); | |
185 var wn = i; | |
186 AsyncPool | |
187 .InvokeNewThread(() => { | |
188 int t; | |
189 Console.WriteLine("Started reader: {0}", wn); | |
190 do { | |
191 while (queue.TryDequeue(out t)) | |
192 Interlocked.Add(ref total, t); | |
193 Thread.Sleep(0); | |
194 } while (writers > 0); | |
195 Console.WriteLine("Stopped reader: {0}", wn); | |
196 return 1; | |
197 }) | |
198 .Then(x => { | |
199 Interlocked.Decrement(ref readers); | |
200 if (readers == 0) | |
201 stop.Set(); | |
202 }); | |
203 } | |
204 | |
205 stop.WaitOne(); | |
206 | |
207 Assert.AreEqual(itemsPerWriter * writersCount, total); | |
137 } | 208 } |
138 | 209 |
139 [TestMethod] | 210 [TestMethod] |
140 public void ComplexCase1Test() { | 211 public void ComplexCase1Test() { |
141 var flags = new bool[3]; | 212 var flags = new bool[3]; |