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]; |
