Semaphore用在多线程的问题
private Semaphore m_Write = new Semaphore(50, 50, "WriteMap");
private Semaphore m_Read = new Semaphore(0, 50, "ReadMap");
private Queue q = new Queue();
public void Push_back(ref string str)
{
m_Write.WaitOne();
q.Enqueue(str);
m_Read.Release();
}
public bool Pop_front(out string s)
{
if (m_Read.WaitOne(10))
{
s = (string)q.Dequeue();
m_Write.Release();
return true;
}
s = null;
return false;
}
一个线程调用Push_back存数据,另一个线程调用Pop_front取数据,有时候可能全部数据读取出来,有时候会少一个或者多个,用q.Count能获取到元素个数不为0,但就是读不出来
public bool Pop_front(out string s)
{
if (q.Count > 0)
{
m_Read.WaitOne();
s = (string)q.Dequeue();
m_Write.Release();
return true;
}
s = null;
return false;
}
如果改为这样的话,就没问题了
为什么会这样呢,难道是m_Read.WaitOne(10)不可靠吗?