gpt4 book ai didi

C# 嵌套同步

转载 作者:太空宇宙 更新时间:2023-11-03 11:51:07 25 4
gpt4 key购买 nike

我有一个包含多个数据成员的类:

public class Foo
{
List<int> intLst;
int Whatever;
HashTable<string> hshTable;
...
}

然后我在 Foo 中有一个函数,它接受两个 Foos 并将它们合并成一个新的 Foo。我也想让 Foo 类线程安全。以下代码是执行此操作的最佳方法吗?

public Foo(Foo f)
{
lock(f)
{
foreach (int i in f.intLst)
{
this.intLst.Add(i)
}
//More complicated
}
}

public Foo Merge(Foo f1, Foo f2)
{
Foo fReturn = new Foo(f1);//Using the constructor above

lock(f2)
{
foreach (int i in f2.intLst)
{
fReturn.intLst.Add(i);
}

//More complicated merge code
}

return fReturn;
}

有这么简单吗?我应该改用监视器吗?我知道锁实现了监视器类,但也许还有一个原因。我还需要担心处理上面示例中的死锁吗?

我觉得我需要同时锁定 f1 和 f2,因为如果 f2 在 f1 的复制构造函数期间发生变化怎么办?

最佳答案

是的,就是这么简单。

你的代码很好。在访问它之前不需要锁定 f2,在复制之后也不需要锁定 f1。所以确实没有必要同时锁定两者。

在您的示例中,项目本身是不可变的简单整数,因此无需锁定它们,但如果您有可变项目,则可能需要锁定单个项目。

您不必担心仅使用此代码会出现死锁,因为您一次只持有一把锁。当然,如果其他一些代码在持有锁的同时调用它,您可能需要担心死锁的可能性。

关于C# 嵌套同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2114970/

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