gpt4 book ai didi

c# - C# 中用于数据结构的惯用的、有保证的互斥锁?

转载 作者:行者123 更新时间:2023-12-04 05:03:31 25 4
gpt4 key购买 nike

假设在 C# 中有一个 Dictionary<K, V>多个线程正在访问和更改的对象。您希望某些操作是线程安全的。

所以你需要一个互斥锁。在 C# 中,使用互斥锁的标准方法是:

lock (someSharedObject)
{
// Mutual exclusion zone here.
myDictionary.Add(1, "hello");
}

问题是,您仅仅依靠文档来阻止 future 的程序员直接访问字典,绕过互斥锁:
myDictionary.Add(1, "hello");

我希望编译器阻止 future 的程序员使用不 protected 字典。

我看到了两种普遍的可能性:
  • 创建一个相似的字典(比如 LockedDictionary ),确保锁定其成员方法,但在其他方面都像字典。
  • 创建一个类来保护对 Dictionary 的访问,所以调用者无法接通 Dictionary无需通过守卫。

  • 这些满足了现在没有人可以不 protected 地使用字典的理想特性,至少是偶然的。我想讨论两者的利弊,然后请您同意或不同意我的观点,并提出我可能忽略的解决方案。
    LockedDictionary的上行空间是对其他人来说是直观的。它还允许细粒度控制哪些方法需要锁定以及锁定到什么程度。缺点是它不完全是 Dictionary ,因此您不能将此对象传递给期望接收 Dictionary 的函数。 . (尽管您可以通过实现 IDictionary 来接近。)

    继续#2。守卫类的好处是你可以实现 IDisposable并像这样使用它:
    class DictionaryFortress {
    Dictionary<K, V> realDict;
    Object lockobject;
    void Lock() {
    Monitor.Enter(lockobject);
    return DictionaryGuard(lockobject, realDict);
    }
    }

    class DictionaryGuard : IDisposable {
    public Dictionary<K, V> Dict {
    get { return realDict; }
    }
    public void Dispose() {
    Monitor.Exit(lockobject);
    }
    }

    // in some class
    DictionaryFortress dict = new DictionaryFortress(); // early on

    // in a function, when we need to access dictionary contents...
    using (DictionaryGuard guard = dict.Lock()) {
    Dictionary<K, V> actualDict = guard.Dict;
    // now you can pass actualDict anywhere; no one has to know that it's locked
    }

    当然,好处是我们可以访问原始字典,因此我们不受如何使用它以及在哪里传递它的限制。缺点是使用它有更多的开销。用户也可以保存对 guard.Dict 的引用。当它可用时,然后在处置 DictionaryGuard 后使用它。

    我倾向于#2。我错过了任何优点和缺点吗?有没有更好的方法来保护对我的字典的访问,同时最大限度地减少误用的风险?同样,我的要求是健忘或粗心的程序员不能跳过锁定阶段。我的愿望是它是惯用的、方便的和灵活的。

    最佳答案

    你考虑过吗 ConcurrentDictionary<TKey, TValue> ?它,和另一个 concurrent collections是在 .NET 4.0 中引入的。

    Represents a thread-safe collection of key/value pairs that can be accessed by multiple threads concurrently.

    关于c# - C# 中用于数据结构的惯用的、有保证的互斥锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15820742/

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