【问题标题】:.net Update a dictionary while other thread gets a value.net 更新字典,而其他线程获取值
【发布时间】:2015-01-18 15:56:35
【问题描述】:

我有一个以速度为主要关注点的 Web 项目 (Web API)。 每个请求都会从内存中的字典中获得响应(根据某个键)。

在其他一些事件中 - 需要使用新值更新此字典。 整个更新过程大约需要 20 秒,此时我不介意根据更改前的字典值获取响应。

我想在每毫秒都很重要的情况下尽快实现字典更改。

我想避免任何锁/互斥锁实现,因为检查它们的值也会很耗时。

这里是否有最佳实践?我不介意“浪费”一些具有旧价值的电话。主要关注的是整体通话速度。

如果出现以下情况会发生什么:

_myDictionary = new Dictionary<>({some dict values});

有一个从 _myDictionary 获取值的调用。 ?

_myDictionary.TryGetValue("some key");

【问题讨论】:

    标签: c# multithreading dictionary asp.net-web-api thread-safety


    【解决方案1】:

    分配引用类型保证是原子操作:

    5.5 变量引用的原子性

    以下数据类型的读写是原子的:bool、char、byte、sbyte、short、ushort、uint、int、float 和引用类型。此外,上一个列表中具有基础类型的枚举类型的读取和写入也是原子的。其他类型的读取和写入,包括 long、ulong、double 和 decimal,以及用户定义的类型,不保证是原子的。除了为此目的设计的库函数之外,不保证原子性的读-修改-写,例如在递增或递减的情况下。

    (来自C# Language Specification

    因此,准备一本新字典,然后在完成后分配它是非常安全的。

    【讨论】:

    • 我知道 ConcurrentDictionary,但所有 get 也使用了一些锁 (Thread.MemoryBarrier();),这对我来说是浪费时间,此外,根据 MSN 应该在许多阅读许多更新场景中使用,我我在谈论很多阅读,很少更新。
    • @briler 我们在这里讨论多少元素、读写?
    • 读取次数很多,IIS 可能需要一秒钟。大约每小时写一次。但是正如我所写的,我不介意写入副本并完全替换所有字典,并且读取使用旧字典,只需寻找替换指针而不引起异常的方法,字典大小应该在 1000 左右-5000 个元素
    • 好了。虽然我真的不认为某些锁定相对于处理整个 IIS 请求所花费的时间是显而易见的。
    • 监视器确实需要大约 20 纳秒。但我在这里需要一个互斥锁,这将是 1 毫秒的时间。
    猜你喜欢
    • 2022-01-12
    • 1970-01-01
    • 2016-01-02
    • 2012-01-18
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    相关资源
    最近更新 更多