gpt4 book ai didi

c# - 我是否需要在以下 C# 代码中使用锁定?

转载 作者:太空狗 更新时间:2023-10-30 00:33:02 24 4
gpt4 key购买 nike

在下面的代码中,我使用两个线程来共享本例中的合理资源,它是一个queue,所以我需要在en-queueing 时使用lock或出队如果是那么为什么因为程序似乎工作正常。

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);
}
}
}
}

最佳答案

是的,System.Collections.Generic.Queue<T>对于同时写入和读取不是线程安全的。您要么需要在入队或出队之前锁定同一对象,要么如果您使用的是 .NET 4/4.5,请使用 System.Collections.Concurrent.ConcurrentQueue<T>类并使用 TryDequeue方法。

到目前为止,您当前的实现没有给您带来问题的原因是 Thread.Sleep(500)调用(不是你应该在生产代码中使用的东西)这意味着 prodThread consumeThread 时不写入队列从中读取,因为读取操作花费的时间少于 500 毫秒。如果删除 Thread.Sleep很可能它会在某个时候抛出异常。

关于c# - 我是否需要在以下 C# 代码中使用锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13998539/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com