public void MultiThreadedAddOk() { const int threadCount = 1000; const int threads = 10; const int count = threads * threadCount; var c = new ConcurrentGrowList <int>(); using (var start = new ManualResetEvent(false)) using (var finish = new CountdownEvent(threads)) { for (var t = 0; t < threads; t++) { var id = t; Task.Factory.StartNew(() => { start.WaitOne(); var startIndex = id * threadCount; for (var i = 0; i < threadCount; i++) { c.Add(startIndex + i); } finish.Signal(); }); } start.Set(); finish.Wait(); Assert.Equal(Enumerable.Range(0, count), c.OrderBy(x => x)); } }
public void CtorWithCapacityWorks() { var c1 = new ConcurrentGrowList <int>(); Assert.Equal(0, c1.Capacity); var c2 = new ConcurrentGrowList <int>(5); Assert.Equal(5, c2.Capacity); }
public void AddReturnsIndexOfAddedItem() { var c = new ConcurrentGrowList <int>(); Assert.Equal(1, c[c.Add(1)]); Assert.Equal(2, c[c.Add(2)]); Assert.Equal(3, c[c.Add(3)]); Assert.Equal(4, c[c.Add(4)]); Assert.Equal(5, c[c.Add(5)]); Assert.Equal(new[] { 1, 2, 3, 4, 5 }, c); }
public void MultiThreadedReadOk() { const int count = 100000; var c = new ConcurrentGrowList <int>(); var snapshots = new List <ConcurrentGrowList <int> .Snapshot>(); var finish = false; using (var start = new ManualResetEvent(false)) { var thread = new Thread(() => { start.WaitOne(); for (var i = 0; i < count; i++) { c.Add(i); } finish = true; }); thread.Start(); snapshots.Add(c.GetSnapshot()); start.Set(); while (!finish) { var snap = c.GetSnapshot(); if (snap.Count == snapshots[snapshots.Count - 1].Count) { continue; } snapshots.Add(snap); } } var lastCount = -1; foreach (var snapshot in snapshots) { Assert.InRange(snapshot.Count, lastCount, count); if (lastCount < 0) { lastCount = 0; } for (var i = lastCount; i < snapshot.Count; i++) { Assert.Equal(i, snapshot[i]); } lastCount = snapshot.Count; } Assert.Equal(Enumerable.Range(0, count), c); }
public void WorksSingleThreaded() { var c = new ConcurrentGrowList <int> { 1, 2, 3, 4, 5 }; Assert.Equal(5, c.Count); Assert.Equal(new[] { 1, 2, 3, 4, 5 }, c); var snap = c.GetSnapshot(); Assert.Equal(5, snap.Count); Assert.Equal(new[] { 1, 2, 3, 4, 5 }, snap); Assert.Equal(1, c[0]); Assert.Equal(2, c[1]); Assert.Equal(3, c[2]); Assert.Equal(4, c[3]); Assert.Equal(5, c[4]); Assert.Equal(1, snap[0]); Assert.Equal(2, snap[1]); Assert.Equal(3, snap[2]); Assert.Equal(4, snap[3]); Assert.Equal(5, snap[4]); }