在多线程编程中,C#环形队列是一种非常高效的数据结构,尤其适用于生产者-消费者模型。然而,当多个线程同时读写队列时,若不加以控制,就会引发数据竞争、脏读甚至程序崩溃。本文将手把手教你如何在 C# 中实现一个并发安全队列,即使是编程小白也能轻松掌握。
环形队列(Circular Queue)是一种固定大小的先进先出(FIFO)缓冲区。它通过两个指针(头指针和尾指针)在数组上循环移动来实现队列操作,避免了普通队列频繁移动元素的开销。
在C#多线程编程场景下,多个线程可能同时执行 Enqueue(入队)或 Dequeue(出队)操作。如果没有同步机制,会导致以下问题:
因此,必须使用锁或其他同步原语来保证线程安全数据结构的行为正确。
下面是一个基于 lock 关键字实现的简单但完整的线程安全环形队列:
public class ConcurrentCircularQueue<T>{ private readonly T[] _buffer; private int _head = 0; private int _tail = 0; private int _count = 0; private readonly object _lock = new object(); public ConcurrentCircularQueue(int capacity) { if (capacity <= 0) throw new ArgumentException("容量必须大于0"); _buffer = new T[capacity]; } public bool TryEnqueue(T item) { lock (_lock) { if (_count == _buffer.Length) return false; // 队列已满 _buffer[_tail] = item; _tail = (_tail + 1) % _buffer.Length; _count++; return true; } } public bool TryDequeue(out T result) { lock (_lock) { if (_count == 0) { result = default(T); return false; // 队列为空 } result = _buffer[_head]; _head = (_head + 1) % _buffer.Length; _count--; return true; } } public int Count { get { lock (_lock) { return _count; } } }}
var queue = new ConcurrentCircularQueue<int>(5);// 生产者线程Task.Run(() =>{ for (int i = 0; i < 10; i++) { if (queue.TryEnqueue(i)) Console.WriteLine($"入队: {i}"); Thread.Sleep(100); }});// 消费者线程Task.Run(() =>{ while (true) { if (queue.TryDequeue(out int value)) Console.WriteLine($"出队: {value}"); else Thread.Sleep(200); }});Console.ReadKey();
虽然上述实现简单有效,但在高并发场景下,lock 可能成为性能瓶颈。你可以考虑以下优化:
ReaderWriterLockSlim(如果读多写少)Interlocked)ConcurrentQueue<T>(但它不是环形且无容量限制)通过本文,你已经学会了如何在 C# 中构建一个支持并发安全队列的环形缓冲区。掌握这种线程安全数据结构的设计思想,对提升你的C#多线程编程能力至关重要。记住,在实际项目中,务必根据性能需求选择合适的同步策略。
关键词回顾:C#环形队列、并发安全队列、C#多线程编程、线程安全数据结构
本文由主机测评网于2025-12-19发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20251210023.html