并发子结构需要是并发的吗?

本文关键字:并发 结构 | 更新日期: 2023-09-27 18:11:04

在多线程应用程序中,我必须实现ConcurrentDictionary<string,Queue<MyClass>>;队列需要是ConcurrentQueue吗?有必要吗?我将把所有元素都放到同一个线程中,所以我认为不是。我说的对吗?编辑:我没有提到我在不同的线程中排队所以我认为正确的结构应该是Dictionary<string,ConcurrentQueue<MyClass>>。字典键只在启动时编辑

并发子结构需要是并发的吗?

如果您只更改传递给AddOrUpdate()调用并发字典的updateValueFactory委托中的队列,那么您可以保证Queue对象一次只能由一个线程访问,因此在这种情况下您不需要使用ConcurrentQueue

例如,下面的代码将允许Enqueue()Dequeue()在您喜欢的任何时候被许多不同的线程调用,并且将防止ConcurrentDictionary中的任何单独的Queue对象同时被多个线程访问:
    private static ConcurrentDictionary<string, Queue<string>> dict;
    public static void Main()
    {
        dict = new ConcurrentDictionary<string, Queue<string>>();
    }
    // If I do this on one thread...
    private static void Enqueue(string key, string value)
    {
        dict.AddOrUpdate(
            key,
            k => new Queue<string>(new[] { value }),
            (k, q) =>
                {
                    q.Enqueue(value);
                    return q;
                });
    }
    // And I do this on another thread...
    private static string Dequeue(string key)
    {
        string result = null;
        dict.AddOrUpdate(
            "key",
            k => new Queue<string>(),
            (k, q) =>
                {
                    result = q.Dequeue();
                    return q;
                });
        return result;
    }