gpt4 book ai didi

c# - 澄清 C# 字典上的读写

转载 作者:可可西里 更新时间:2023-11-01 08:48:28 25 4
gpt4 key购买 nike

在本声明的上下文中,

A Dictionary can support multiple readers concurrently, as long as the collection is not modified. Even so, enumerating through a collection is intrinsically not a thread-safe procedure. In the rare case where an enumeration contends with write accesses, the collection must be locked during the entire enumeration. To allow the collection to be accessed by multiple threads for reading and writing, you must implement your own synchronization.

读写是什么意思?我的理解是,读取是一种查找键并提供对其值的引用的操作,而写入是一种从字典中添加或删除键值对的操作。但是,我找不到关于此的任何结论。

所以最大的问题是,在实现线程安全字典时,更新字典中现有键的值的操作是否被视为读取器或写入器?我计划让多个线程访问字典中的唯一键并修改它们的值,但线程不会添加/删除新键。

假设修改现有值不是对字典的写操作,明显的暗示是我的线程安全字典的实现可以更有效,因为我不需要每次都获得排它锁尝试将值更新为现有键。

不能使用 .Net 4.0 中的 ConcurrentDictionary。

最佳答案

尚未提及的重点是如果 TValue是类类型,Dictionary<TKey,TValue>持有的东西将是 TValue身份对象。如果一个人从字典中接收到一个引用,则该字典将既不知道也不关心我们可能对所引用的对象所做的任何事情。

在需要使用它的代码之前已知与字典关联的所有键的情况下,一个有用的小实用程序类是:

class MutableValueHolder<T>
{
public T Value;
}

如果想用多线程代码计算各种字符串在一堆文件中出现的次数,并且事先知道所有感兴趣的字符串,那么可以使用类似 Dictionary<string, MutableValueHolder<int>> 的东西为了这个目的。一旦字典加载了所有正确的字符串和一个 MutableValueHolder<int>每个实例,那么任意数量的线程都可以检索对 MutableValueHolder<int> 的引用对象,并使用 Threading.Interlocked.Increment或其他此类方法来修改 Value与每一个相关联,根本不必写入字典。

关于c# - 澄清 C# 字典上的读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4695627/

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