我相信这个问题已经被问了很多次,但是我想清楚这个概念。
最近,在两个不同的函数中有两个线程访问同一个列表时,我遇到了一个bug。如果我没有正确的锁定,在什么情况下会出现问题?即使我在第二个函数中有一个锁,并且这两个线程没有关联,它们正在操作同一个列表。其中一个正在添加,另一个正在与空列表交换。在什么情况下会触发异常?请帮忙。
伪代码:
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;
}