构建线程安全队列示例

Posted 庭前花满留晚照

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构建线程安全队列示例相关的知识,希望对你有一定的参考价值。

 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     }

 

以上是关于构建线程安全队列示例的主要内容,如果未能解决你的问题,请参考以下文章

Java核心技术读书笔记10-2 阻塞队列线程安全集合类Callable与Future线程池与任务组同步框架

为什么我的多进程队列看起来不是线程安全的?

线程安全的队列

NSManagedObjectContext 并发

从零开始学多线程之构建快

基于信号量与环形队列实现读写异步缓存队列