看看这个线程安全的队列为什么会一直阻塞?在什么情况下

蔡袅 2013-04-14 12:04:36
  internal sealed class SyncQueue<T>
{
private readonly Object m_lock = new object();
private readonly Queue<T> m_queue = new Queue<T>();

public void Enqueue(T item)
{
Monitor.Enter(m_lock);
m_queue.Enqueue(item);
Monitor.PulseAll(m_lock);
Monitor.Exit(m_lock);
}

public T Dequeue()
{
Monitor.Enter(m_lock);
while (m_queue.Count == 0) Monitor.Wait(m_lock);
T item = m_queue.Dequeue();
Monitor.Exit(m_lock);
return item;
}
}
...全文
187 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
游戏人间 2013-04-16
  • 打赏
  • 举报
回复
你确定有测试过吗?
luobing261314 2013-04-15
  • 打赏
  • 举报
回复
当队列没数据 Dequeue不是一直等有数据吗? Dequeue一直等的话 Enqueue又怎么可能执行呢 死锁了
请叫我卷福 2013-04-15
  • 打赏
  • 举报
回复
当队列没数据 Dequeue不是一直等有数据吗? Dequeue一直等的话 Enqueue又怎么可能执行呢 死锁了
游戏人间 2013-04-15
  • 打赏
  • 举报
回复
要么试试这个


  internal sealed class SyncQueue<T>
    {
        private readonly Object m_lock = new object();
        private readonly Queue<T> m_queue = new Queue<T>();

        public void Enqueue(T item)
        {
           lock(m_lock)
{
            m_queue.Enqueue(item);
           }
        }

        public T Dequeue()
        {
           lock(m_lock)
       {
           
            T item = m_queue.Dequeue();
       
            return item;
        }
}
    }
蔡袅 2013-04-15
  • 打赏
  • 举报
回复
引用 3 楼 wonderfuly 的回复:
要么试试这个 C# code?123456789101112131415161718192021222324 internal sealed class SyncQueue<T> { private readonly Object m_lock = new object(); private readonly Queue<T> m……
这个也会有问题,无数据时出队列会出现异常
蔡袅 2013-04-15
  • 打赏
  • 举报
回复
引用 5 楼 luobing261314 的回复:
当队列没数据 Dequeue不是一直等有数据吗? Dequeue一直等的话 Enqueue又怎么可能执行呢 死锁了
你们这是瞎猜呢,里面有几千条数据的时候都死锁了
gomoku 2013-04-14
  • 打赏
  • 举报
回复
这个SyncQueue从它的本意看,叫BlockingQueue更合适,类似.Net4下的BlockingCollection。 Dequeue的时候是会阻塞,并一直等到队列里出现数据。
蔡袅 2013-04-14
  • 打赏
  • 举报
回复
引用 1 楼 gomoku 的回复:
这个SyncQueue从它的本意看,叫BlockingQueue更合适,类似.Net4下的BlockingCollection。 Dequeue的时候是会阻塞,并一直等到队列里出现数据。
嗯,这个是未到4.0. 应该不是等待数据出现吧, 测试了采用多个线程加入数据,多个线程读取数据出现了死锁一直阻塞...
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧