gpt4 book ai didi

c# - 线程测试题

转载 作者:太空狗 更新时间:2023-10-29 18:19:08 26 4
gpt4 key购买 nike

我最近在一个类似于下面的测试中遇到了一个面试问题,我没有太多使用线程开发的经验,有人可以帮助我告诉我如何处理这个问题吗?:

public class StringQueue
{
private object _lockObject = new object();

private List<string> _items = new List<string>();

public bool IsEmpty()
{
lock (_lockObject)
return _items.Count == 0;
}

public void Enqueue(string item)
{
lock (_lockObject)
_items.Add(item);
}

public string Dequeue()
{
lock (_lockObject)
{
string result = _items[0];
_items.RemoveAt(0);

return result;
}
}
}

对于上述实现,以下方法线程安全吗?为什么?

public string DequeueOrNull()
{
if (IsEmpty())
return null;

return Dequeue();
}

最佳答案

在我看来答案是否定的。

当 isEmpty() 过程锁定对象时,它会在调用返回后立即释放 -一个不同的线程可能会在调用 IsEmpty() 和 Dequeue() 之间调用 DequeueOrNull()(此时对象被解锁),从而删除唯一存在的项目,使 Dequeue() 当时无效。

一个看似合理的解决方法是在 DequeueOrNull() 中的两个语句上加锁,因此没有其他线程可以在检查之后但在 DeQueue() 之前调用 DeQueue()。

关于c# - 线程测试题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6617948/

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