我有多个线程将数据写入一个公共(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/