在C#中,可以使用lock
语句来对队列进行加锁和解锁,以确保在多线程环境下的线程安全。以下是一个简单的示例:
using System;
using System.Collections.Generic;
using System.Threading;
public class ThreadSafeQueue<T>
{
private readonly Queue<T> _queue = new Queue<T>();
private readonly object _lockObject = new object();
public void Enqueue(T item)
{
lock (_lockObject)
{
_queue.Enqueue(item);
}
}
public T Dequeue()
{
lock (_lockObject)
{
return _queue.Dequeue();
}
}
public int Count
{
get
{
lock (_lockObject)
{
return _queue.Count;
}
}
}
}
class Program
{
static void Main(string[] args)
{
ThreadSafeQueue<int> threadSafeQueue = new ThreadSafeQueue<int>();
Thread producer = new Thread(() =>
{
for (int i = 0; i < 10; i++)
{
threadSafeQueue.Enqueue(i);
Console.WriteLine($"Produced: {i}");
Thread.Sleep(1000);
}
});
Thread consumer = new Thread(() =>
{
while (threadSafeQueue.Count > 0)
{
int item = threadSafeQueue.Dequeue();
Console.WriteLine($"Consumed: {item}");
Thread.Sleep(1000);
}
});
producer.Start();
consumer.Start();
producer.Join();
consumer.Join();
Console.WriteLine("Finished");
}
}
在这个示例中,ThreadSafeQueue<T>
类封装了一个队列,并提供了线程安全的Enqueue
、Dequeue
方法和一个获取队列元素数量的属性。通过使用同一个锁对象_lockObject
,可以确保在执行入队、出队操作时不会发生竞态条件。