我需要在下面的c#代码中使用锁定吗?

本文关键字:锁定 代码 在下面 | 更新日期: 2023-09-27 17:49:18

在下面的代码中,我使用两个线程共享相同的资源,在这个例子中,它是一个queue,所以我需要使用locken-queueing or dequeuing,如果是,那么为什么因为程序似乎工作良好。

class Program
{   
    static Queue<string> sQ = new Queue<string>();
    static void Main(string[] args)
    {
        Thread prodThread = new Thread(ProduceData);
        Thread consumeThread = new Thread(ConsumeData);
        prodThread.Start();
        consumeThread.Start();
        Console.ReadLine();
    }
    private static void ProduceData()
    {
        for (int i = 0; i < 100; i++)
        {
            sQ.Enqueue(i.ToString());               
        }
    }
    private static void ConsumeData()
    {
        while (true)
        {
            if (sQ.Count > 0)
            {
                string s = sQ.Dequeue();
                Console.WriteLine("DEQUEUE::::" + s);
            }
        }
    }
}

我需要在下面的c#代码中使用锁定吗?

是的,您这样做,System.Collections.Generic.Queue<T>不是线程安全的写入和读取从同一时间。你要么需要在查询或请求之前锁定同一个对象,要么如果你使用。net 4/4.5使用System.Collections.Concurrent.ConcurrentQueue<T>类,而不是使用TryDequeue方法。

到目前为止,您当前的实现没有给您带来问题的原因是由于Thread.Sleep(500)调用(不是您应该在生产代码中使用的东西),这意味着prodThread不写入队列,而consumeThread从队列中读取,因为读取操作需要少于500ms。如果您删除Thread.Sleep的可能性是,它将抛出一个异常在某个点