#中使用Monitor类、Lock和Mutex类来同步多线程的执行
![](https://p-blog.csdn.net/images/p_blog_csdn_net/tjvictor/49f6572e7070480bbb0b0c0ae529beaa.png)
![](https://p-blog.csdn.net/images/p_blog_csdn_net/tjvictor/9100c299531d43e7a35aeffac7b267f1.png)
![](https://p-blog.csdn.net/images/p_blog_csdn_net/tjvictor/672cde0b62ba48b6a217f3131111c545.png)
}
一个monitor 的例子:
using System.Collections.Generic;
using System.Threading;
namespace OpenSim.Framework
{
public class BlockingQueue<T>
{
private readonly Queue<T> m_pqueue = new Queue<T>();
private readonly Queue<T> m_queue = new Queue<T>();
private readonly object m_queueSync = new object();
public void PriorityEnqueue(T value)
{
lock (m_queueSync)
{
m_pqueue.Enqueue(value);
Monitor.Pulse(m_queueSync);
}
}
public void Enqueue(T value)
{
lock (m_queueSync)
{
m_queue.Enqueue(value);
Monitor.Pulse(m_queueSync);
}
}
public T Dequeue()
{
lock (m_queueSync)
{
if (m_queue.Count < 1 && m_pqueue.Count < 1)
{
Monitor.Wait(m_queueSync);
}
if (m_pqueue.Count > 0)
return m_pqueue.Dequeue();
return m_queue.Dequeue();
}
}
public T Dequeue(int msTimeout)
{
lock (m_queueSync)
{
if (m_queue.Count < 1 && m_pqueue.Count < 1)
{
Monitor.Wait(m_queueSync, msTimeout);
}
if (m_pqueue.Count > 0)
return m_pqueue.Dequeue();
if (m_queue.Count > 0)
return m_queue.Dequeue();
return default(T);
}
}
public bool Contains(T item)
{
lock (m_queueSync)
{
if (m_pqueue.Contains(item))
return true;
return m_queue.Contains(item);
}
}
public int Count()
{
lock (m_queueSync)
{
return m_queue.Count+m_pqueue.Count;
}
}
public T[] GetQueueArray()
{
lock (m_queueSync)
{
return m_queue.ToArray();
}
}
}
}