public void Reset_WithWaiters()
        {
            var autoResSlim = new AutoResetSuperSlimLock(false);

            int       releasedCounter = 0;
            const int totalThreads    = 5;

            for (int i = 0; i < totalThreads; i++)
            {
                new Thread(() =>
                {
                    autoResSlim.Wait();

                    Interlocked.Increment(ref releasedCounter);
                })
                {
                    IsBackground = true
                }.Start();
            }

            Thread.Sleep(2000);

            autoResSlim.Waiters.Should().Be(totalThreads);

            autoResSlim.Reset();

            Thread.Sleep(100);

            autoResSlim.Waiters.Should().Be(0);
            releasedCounter.Should().Be(totalThreads);

            autoResSlim.IsSet.Should().BeFalse();
        }
示例#2
0
        public void StopAndBlockBuffers()
        {
            _state._resetApplied = true;

            _writeLock.Reset();
            _readLock.Reset();

            _state._readPosition  = _state._readPositionCopy = 0;
            _state._writePosition = _state._writePositionCopy = 0;
        }
示例#3
0
        internal void Reset()
        {
            _state._resetApplied = true;

            _readLock.Reset();
            _writeLock.Reset();

            _state._readPosition  = _state._readPositionCopy = 0;
            _state._writePosition = _state._writePositionCopy = 0;

            Thread.MemoryBarrier();
        }