首页 > 解决方案 > C# 不可变哈希集锁定

问题描述

假设服务器存储连接数据的 ImmutableHashSet

ImmutableHashSet<ConnectionData> connections = new ...

然后我有各种调用添加/删除/读取这个,即:

OnConnected(connectionData) => connections = connections.Add(connectionData);
OnDisconnected(connectionData) => connections = connections.Remove(connectionData);

我的问题是,在上述仅对 HashSet 执行单个操作(添加/删除)的调用中,我应该锁定连接吗?还是 ImmutableHashSet 操作线程安全?

标签: c#c#-7.0

解决方案


您将值直接分配回集合的模式不是线程安全的。但是,您通常不希望lock在使用不可变集合时这样做。这些集合的主要特性之一是无锁操作,这通常显着提高性能。相反,使用ImmutableInterlocked类:

ImmutableHashSet<ConnectionData> connections;

ImmutableInterlocked.Update(ref connections,
                            (collection, item) => collection.Add(item),
                            connectionData);

ImmutableInterlocked.Update(ref connections,
                            (collection, item) => collection.Remove(item),
                            connectionData);

推荐阅读