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)不可靠吗?
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)不可靠吗?
...全文
相关推荐
pc_semaphore.zip_pc_semaphore
pc_semaphore.zip_pc_semaphore"这个压缩包文件,显然与线程同步机制有关,特别是使用信号量(Semaphore)解决读者-写者问题。
Delphi多线程之Semaphore_(信号对象).pdf
在实际应用中,Semaphore 可以用于解决多种多线程问题,例如:* 控制多线程之间的访问顺序,避免冲突和阻塞。* 实现资源的并发访问,例如银行的业务窗口。
Linux下多线程编程-Pthread与Semaphore的使用.doc
Semaphore 是一种同步机制,用于控制多个线程的访问顺序。Semaphore 可以用来解决多线程编程中的典型问题,如生产者-消费者问题。
Python多线程同步Lock、RLock、Semaphore、Event实例
Python中的多线程同步机制是为了在并发环境下保护共享资源,防止数据不一致和死锁等问题。
C#语言Semaphore类用法实例(多线程多端口使用端口控制)
总的来说,Semaphore类在C#中的应用可以帮助开发者有效地管理资源,避免因过度并发导致的冲突和数据不一致性问题。


