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
No trackbacks yet.