この質問は何度も聞かれたと思いますが、この概念を明確にしたいと思います。
最近、2 つのスレッドが 2 つの異なる関数で同じリストにアクセスしているときに、バグに遭遇しました。適切なロックがないと、どのようなシナリオで問題が発生する可能性がありますか? 2 番目の関数にロックがあり、2 つのスレッドは関連していませんが、同じリストを操作しています。1 つは追加、もう 1 つは空のリストとの交換です。どのような状況で例外をキャッチしますか? 助けてください。
擬似コード:
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;
}