gpt4 book ai didi

c# - 如果不使用锁定,这不应该失败吗?简单生产者消费者

转载 作者:行者123 更新时间:2023-11-30 14:02:18 26 4
gpt4 key购买 nike

我有一个队列,一个包含生产者线程的列表和一个包含消费者线程的列表。

我的代码是这样的

    public class Runner
{
List<Thread> Producers;
List<Thread> Consumers;
Queue<int> queue;
Random random;

public Runner()
{
Producers = new List<Thread>();
Consumers = new List<Thread>();

for (int i = 0; i < 2; i++)
{
Thread thread = new Thread(Produce);
Producers.Add(thread);
}

for (int i = 0; i < 2; i++)
{
Thread thread = new Thread(Consume);
Consumers.Add(thread);
}

queue = new Queue<int>();
random = new Random();

Producers.ForEach(( thread ) => { thread.Start(); });
Consumers.ForEach(( thread ) => { thread.Start(); });
}

protected void Produce()
{
while (true)
{
int number = random.Next(0, 99);
queue.Enqueue(number);
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " Produce: " + number);
}
}

protected void Consume()
{
while (true)
{
if (queue.Any())
{
int number = queue.Dequeue();
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " Consume: " + number);
}
else
{
Console.WriteLine("No items to consume");
}
}
}
}

这不应该是没有使用 lock 关键字的悲惨原因吗?它失败了一次,因为它试图在队列为空时出列,使用 lock 关键字可以解决这个问题吗?

如果上面的代码不需要lock关键字,那什么时候需要呢?

提前致谢! =)

最佳答案

锁定是为了消除应用程序的异常行为,尤其是在多线程中。最常见的目标是消除导致不确定程序行为的“竞争条件”。

这是您看到的行为。在一次运行中,您收到队列没有项目的错误,在另一次运行中,您没有任何问题。这是一个竞争条件。正确使用锁定将消除这种情况。

关于c# - 如果不使用锁定,这不应该失败吗?简单生产者消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6207307/

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