public void CanDecToValue(long initial, long value, long expected)
        {
            var tslong = new ThreadSafeLong(initial);

            tslong.DecTo(value);
            Assert.Equal(expected, tslong.Value);
        }
        public async Task DecToMultiThreads(int threads, int observations)
        {
            var tslong   = new ThreadSafeLong(0);
            var testData = new IEnumerable <long> [threads];
            var min      = long.MaxValue;

            for (var i = 0; i < threads; i++)
            {
                var data = GenerateTestData(observations);
                min         = Math.Min(data.min, min);
                testData[i] = data.items;
            }

            await Task.WhenAll(testData.Select(async d =>
            {
                foreach (long item in d)
                {
                    await Task.Yield();
                    tslong.DecTo(item);
                }
            }).ToArray());

            Assert.Equal(min, tslong.Value);
        }