gpt4 book ai didi

c# - 我是否需要锁定将 ReadOnlyCollection 作为参数的并发方法?

转载 作者:行者123 更新时间:2023-11-30 22:02:31 25 4
gpt4 key购买 nike

假设一个方法看起来像这样。

Class MyClass
public string ConcatenateList(ReadOnlyCollection<string> aList)
{
var result = new StringBuilder();
foreach (string s in aList)
{
result.Append(", " + s);
}
return result.ToString();
}

下面是调用者创建只读列表以传递给 MyClass.ConcatenateList 方法的示例。

var list = new List<string>(){"hello","world"};
var readOnlyList = new ReadOnlyCollection<string>(list);

虽然该方法确实不能修改列表,但要求调用者能够在执行该方法时修改基础列表。此外,方法必须是并发的

2个问题:

(1) 鉴于上述要求,方法中是否存在竞争条件?据我所知,没有。 ThreadA 永远不会读取或写入 ThreadB 的 StringBuilder,因此不存在并发问题,因此不需要锁。真的吗?

(2) 是否会出现并发导致返回字符串出现意外结果的情况?一个示例:即使在执行过程中将“howdy”添加到仅由 ThreadB 拥有的列表中,ThreadA 也会返回“,hello,world,howdy”。这会发生吗?

我试图理解,给定并发性,如果 ConcatenateList() 必须是“纯函数”,即该方法保证其参数“aList”在整个方法执行?

提前感谢您的想法!

最佳答案

ReadOnlyCollection 不会将构造函数中提供的列表中的数据复制到仅公开只读成员的新集合中。相反,它只是包装提供的 IList 并且只公开它的只读成员。

这意味着 ReadOnlyList 正在访问您代码中原始 List 引用正在访问的同一内存,并且需要使用适当的同步以便这是为了安全。在这个例子中,由于没有同步,调用者对底层列表的修改,而另一个线程正在访问只读列表,可能会导致任意数量的未定义行为。

关于c# - 我是否需要锁定将 ReadOnlyCollection 作为参数的并发方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26809449/

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