zoukankan      html  css  js  c++  java
  • 构建线程安全队列示例

     1     /// <summary>
     2     /// 线程安全的队列
     3     /// 允许多个线程对队列入队出队
     4     /// 注意:除非有一个可供处理的数据项,否则试图出队一个数据项的线程会一直阻塞
     5     /// </summary>
     6     /// <typeparam name="T"></typeparam>
     7     internal sealed class SynchronizedQueue<T>
     8     {
     9         //进出队使用同一个锁
    10         private readonly object m_lock = new object();
    11 
    12         private readonly Queue<T> m_queue = new Queue<T>();
    13 
    14         /// <summary>
    15         /// 入队
    16         /// </summary>
    17         /// <param name="item"></param>
    18         public void Enqueue(T item)
    19         {
    20             Monitor.Enter(m_lock);
    21 
    22             //一个数据项入队
    23             m_queue.Enqueue(item);
    24 
    25             //唤醒所有正在等待的线程
    26             Monitor.PulseAll(m_lock);
    27 
    28             Monitor.Exit(m_lock);
    29         }
    30 
    31         /// <summary>
    32         /// 出队
    33         /// </summary>
    34         /// <returns></returns>
    35         public T Dequeue()
    36         {
    37             Monitor.Enter(m_lock);
    38 
    39             //队列为空就一直循环
    40             while (m_queue.Count == 0)
    41             {
    42                 Monitor.Wait(m_lock);
    43             }
    44 
    45             //一个数据项出队
    46             T item = m_queue.Dequeue();
    47 
    48             Monitor.Exit(m_lock);
    49 
    50             return item;
    51         }
    52     }
  • 相关阅读:
    Linux启动mysql命令
    Linux启动Apache服务器命令
    使用SSH命令从一台Linux远程登陆到另一台Linux
    Linux关机命令
    从Windows复制文件到Linux
    无法访问SVN历史记录的问题
    linux静态IP最简配置
    学习之Redis(二)
    学习之Redis(一)
    MySQL数据库笔记总结
  • 原文地址:https://www.cnblogs.com/xuejietong/p/9022137.html
Copyright © 2011-2022 走看看