gpt4 book ai didi

c# - 可以锁定所有键的 AsyncDuplicateLock

转载 作者:行者123 更新时间:2023-11-30 16:38:21 26 4
gpt4 key购买 nike

我需要一把类似于 Stephen Cleary 的回答中的锁:https://stackoverflow.com/a/31194647/4381408

但是,我还需要能够同时锁定所有键。我正在使用 Stephen Cleary's AsyncEx library同样,所以我想像这样将 AsyncDuplicateLock 与 AsyncReaderWriterLock 结合起来:

public sealed class AsyncDuplicateReaderWriterLock
{
private AsyncReaderWriterLock _rwLock = new AsyncReaderWriterLock();
private AsyncDuplicateLock _duplicateLock = new AsyncDuplicateLock();

public IDisposable ReaderLock(object key)
{
return CollectionDisposable.Create(
_rwLock.ReaderLock(),
_duplicateLock.Lock(key)
);
}

public async Task<IDisposable> ReaderLockAsync(object key)
{
return CollectionDisposable.Create(
await _rwLock.ReaderLockAsync(),
await _duplicateLock.LockAsync(key));
}

public IDisposable WriterLock()
{
return _rwLock.WriterLock();
}

public async Task<IDisposable> WriterLockAsync()
{
return await _rwLock.WriterLockAsync();
}
}

这样,我可以使用 ReaderLock 锁定一个键,并使用 WriterLock 锁定所有键。做对这一点很重要,所以我想确保没有办法让它死锁或锁定不正确。我对此没有足够的信心。

那么这项工作是否有效,并且是线程安全的?

感谢您的帮助!

最佳答案

我强烈,强烈建议您退后一步,想想您要解决的实际问题,向其他人解释,并询问他们如何解决并发问题.

就是说,是的,您可以(ab)使用读取器/写入器锁来执行此操作。就个人而言,我会分开锁定:

public IDisposable ReaderLock(object key)
{
var rwKey = _rwLock.ReaderLock();
var duplicateKey = _duplicateLock.Lock(key);
return CollectionDisposable.Create(rwKey, duplicateKey);
}

// (and the same for async)

这使得代码首先采用 RWL 变得更加明显(为了正确,它必须这样做)。

关于c# - 可以锁定所有键的 AsyncDuplicateLock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55283882/

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