gpt4 book ai didi

c# - 如果我从 Albahari 的生产者/消费者队列实现中删除 lock() 会发生什么

转载 作者:行者123 更新时间:2023-12-01 16:28:09 25 4
gpt4 key购买 nike

我正在学习多线程,并遇到了生产者/消费者问题。

这是sample implementation of a producer/consumer queue taken from the Albahari's website (《C# in a Nutshell》系列丛书的作者):

using System;
using System.Threading;
using System.Collections.Generic;

class ProducerConsumerQueue : IDisposable
{
EventWaitHandle _wh = new AutoResetEvent (false);
Thread _worker;
readonly object _locker = new object();
Queue<string> _tasks = new Queue<string>();

public ProducerConsumerQueue()
{
_worker = new Thread (Work);
_worker.Start();
}

public void EnqueueTask (string task)
{
lock (_locker) // <---------------------------------------------- 1
_tasks.Enqueue (task);
_wh.Set();
}

public void Dispose()
{
EnqueueTask (null); // Signal the consumer to exit.
_worker.Join(); // Wait for the consumer's thread to finish.
_wh.Close(); // Release any OS resources.
}

void Work()
{
while (true)
{
string task = null;
lock (_locker) // <---------------------------------------------- 2
if (_tasks.Count > 0)
{
task = _tasks.Dequeue();
if (task == null) return;
}
if (task != null)
{
Console.WriteLine ("Performing task: " + task);
Thread.Sleep (1000); // simulate work...
}
else
_wh.WaitOne(); // No more tasks - wait for a signal
}
}
}

我理解代码,但我的问题是,如果我删除用“1”和“2”注释的行中的锁,会发生什么?我尝试想象不同的并发场景,但找不到会导致问题的场景。

如果您决定回答我的问题,请详细说明可能导致问题的操作步骤。

最佳答案

Queue<T>不是线程安全的。

如果你从多个线程写入它,它就会中断。
(可能是当两个线程尝试同时调整缓冲区大小时)

此外,即使它是线程安全的,删除第二个锁将允许第二个线程删除最后一个项目,而第一个线程位于 if 内。 ,使第一个线程尝试读取空队列。

关于c# - 如果我从 Albahari 的生产者/消费者队列实现中删除 lock() 会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23876617/

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