SynchronizedQueue or readers-writers synchronization

1)writers can put something in queue
2)reader can take something from queue
3) if queue is empty readers wait while writers put something in queue :)

public class SynchronyzedQueue<T>
    {
        readonly object _rootSync = new object();//sync internal queue 
        readonly Queue<T> _queue= new Queue<T>();//internal queue 
        readonly Semaphore _semaphore = new Semaphore(0,int.MaxValue);
       
        /// <summary>
        /// Enqueue element from queue and release semaphore
        /// </summary>
        /// <param name="item"></param>
        public void Enqueue(T item)
        {
            lock (_rootSync)
            {
                _queue.Enqueue(item);  
            }
            _semaphore.Release();
        }
        /// <summary>
        /// Dequeue element to queue and WaitOne semaphore
        /// </summary>
        /// <param name="item"></param>
        public T Dequeue()
        {
            _semaphore.WaitOne();
            lock (_rootSync)
            {
                return _queue.Dequeue();
            }
        }
        /// <summary>
        /// clean Queue and invoke all sleep threads. Produce Exception if has sleeping threads in Dequeue operation
        /// </summary>
        public void Clear()
        {
            lock (_rootSync)
            {
                int releaseCount = _queue.Count;
                _queue.Clear();
                _semaphore.Release(releaseCount);
            }
        }
    }

Advertisement
  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.