gpt4 book ai didi

c# - C#中同时添加和删除列表中的项目-线程中的锁

转载 作者:行者123 更新时间:2023-12-02 06:16:55 24 4
gpt4 key购买 nike

我确信这个问题会被问很多次,但我想澄清这个概念。

最近,当两个线程在两个不同的函数中访问同一列表时,我遇到了一个错误。如果我没有正确的锁定,在什么情况下会导致问题?即使我在第二个函数中有锁并且两个线程不相关,但它们正在操作相同的列表。一种是添加,另一种是与空列表交换。什么情况下会捕获异常?请帮忙。

伪代码:

List<SomeClass> list=new List<SomeClass>();

object mutex=new object();

线程1访问该函数并修改列表:

public void Manipulate()
{

//some operation
list.add(new SomeClass());

}

线程2访问该函数并清除列表:

public void SwapList()
{
List<SomeClass> cls=new List<SomeClass>();
try
{
while(Thread2.isAlive)
{
//some operation
if(list.Count()>0)
{
lock(mutex)
{
swap(ref list,ref cls)
}
}
}
}
catch(exception ex)
{
}
}
public void swap(List<SomeClass> a, List<SomeClass> b)
{
List<SomeClass> temp=a;
a=b;
b=temp;
}

最佳答案

In what scenarios can that cause problems if I don't have the proper locking?

每当至少有两个线程同时访问数据并且其中至少一个线程正在写入时。

因此,只要有一些数据可以从多个线程访问,您就应该锁定。您需要锁定对该数据的每次访问。

作为替代方案,您可以使用线程安全的数据结构(例如 System.Collections.Concurrent 中的集合)。如果您这样做,则不必担心自己被锁定,因为结构已经正确(且高效)地完成了操作。

关于c# - C#中同时添加和删除列表中的项目-线程中的锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19460619/

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