UniVRM/MonitorQueue.cs
ousttrue f20f27259c Squashed 'DepthFirstScheduler/' content from commit d0c62ba
git-subtree-dir: DepthFirstScheduler
git-subtree-split: d0c62ba0fbef280af0ef5ec41963bef847185efb
2018-12-28 21:15:54 +09:00

48 lines
1.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Threading;
namespace DepthFirstScheduler
{
/// <summary>
/// http://blogs.msdn.com/b/toub/archive/2006/04/12/blocking-queues.aspx
///
/// 終了を通知するにはnullを投入する手が使える
/// </summary>
/// <typeparam name="T"></typeparam>
public class MonitorQueue<T>
{
private Int32 _count = 0;
public Int32 Count
{
get
{
return _count;
}
}
private Queue<T> _queue = new Queue<T>();
public T Dequeue()
{
lock (_queue)
{
while (_count <= 0) Monitor.Wait(_queue);
_count--;
return _queue.Dequeue();
}
}
public void Enqueue(T data)
{
lock (_queue)
{
_queue.Enqueue(data);
_count++;
Monitor.Pulse(_queue);
}
}
}
}