c# - C# 中的命名锁集合?

标签 c# synchronization mutex

我有多个线程将数据写入一个公共(public)源,我希望两个线程在且仅当它们接触同一 block 数据时相互阻塞。

最好有一种方法专门锁定任意键:

string id = GetNextId();
AquireLock(id);
try
{
    DoDangerousThing();
}
finally
{
    ReleaseLock(id);
}

如果没有其他人试图锁定同一个 key ,我希望他们能够同时运行。

我可以用一个简单的互斥量字典来实现这一点,但我需要担心驱逐旧的、未使用的锁,如果集合变得太大,这可能会成为一个问题。

是否存在这种类型的锁定模式的现有实现。

最佳答案

您可以尝试使用 ConcurrentDictionary<string, object> 创建命名对象实例。当你需要一个新的锁实例(你以前没有使用过)时,你可以将它添加到字典中(添加是通过 GetOrAdd 的原子操作),然后一旦你从中提取它,所有线程就可以共享同一个命名对象字典,基于您的数据。

例如:

// Create a global lock map for your lock instances.
public static ConcurrentDictionary<string, object> GlobalLockMap =
    new ConcurrentDictionary<string, object> ();

// ...

var oLockInstance = GlobalLockMap.GetOrAdd ( "lock name", x => new object () );

if (oLockInstance == null)
{
    // handle error
}

lock (oLockInstance)
{
    // do work
}

关于c# - C# 中的命名锁集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26724460/

相关文章:

c# - 为什么C#和VB.NET如此相似?

c# - 是否有与 Java 的 CountDownLatch 等效的 C#?

c - 如何控制具有多个互斥锁和条件的线程?

operating-system - 何时使用 MCS 锁

linux - 我们可以在启动期间在设备驱动程序等中使用互斥量吗?

c# - 提取网格或点云的中心曲线(中轴或拓扑骨架)的代码?

C# TextFieldParser 与\n

c# - 如何在 ZedGraph 中同步三个 GraphPane?

c - 工作线程和 Controller 线程同步