gpt4 book ai didi

c# - SemaphoreSlim 在极端条件下无法正常工作?

转载 作者:太空宇宙 更新时间:2023-11-03 13:25:52 24 4
gpt4 key购买 nike

我们正在使用 .NET 4.5.1 开发一个应用程序,并在后台使用 SemaphoreSlim 实现了我自己的“异步锁”。要锁定,我们使用以下方法:

public async Task<IDisposable> LockAsync(CancellationToken cancellationToken = default(CancellationToken))
{
await SyncRoot.WaitAsync(cancellationToken).ConfigureAwait(false);
return this;
}

SyncRootnew SemaphoreSlim(1) 实例。

这似乎在“生产”中运行良好,但在以下单元测试中失败了:

for (int i = 0; i < numberOfTasks; i++)
{
tasks[i] = Task.Run<Task>(async () =>
{
Interlocked.Increment(ref counterAtomicBegin);
using (await alock.LockAsync().ConfigureAwait(false))
{
counterLocked += 1;
}
Interlocked.Increment(ref counterAtomicEnd);
});
}

最后 counterLockedcounterAtomicBegin 不相等(在 100k 任务时它们大约减少 1k)。

是我做错了什么还是 SemaphoreSlim 的问题?

更新:按照建议删除嵌套逻辑并调整文本。
请参阅以下代码(可在 LINQPad 中执行)进行测试:http://pastebin.com/WXecZxqu

最佳答案

你的逻辑不正确。

异步锁不是线程仿射的,所以线程持有锁的整个概念是不正确的。相反,代码 的特定部分持有锁,并且该代码的部分可能在不同的线程上执行。

在我看来,recursive locks are a bad idea (链接是我的详细博客文章)。理论上可以编写递归异步锁(我知道的唯一实现是 part of the test suite for my AsyncEx library ),但它只能在 .NET 4.5 完整框架上运行,我仍然认为这不是一个好主意。

关于c# - SemaphoreSlim 在极端条件下无法正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22482042/

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