C# 嵌套信号量限制、安全性和死锁
我有一个使用C# 嵌套信号量限制、安全性和死锁,c#,.net,.net-core,C#,.net,.net Core,我有一个使用SemaphoreSlim的类,它使用SemaphoreSlim调用另一个类。它运行时没有死锁或争用条件 这方面的一般指导方针是什么 try { await _semaphoreSlim.WaitAsync(); DoWork(); } catch (Exception e) { } finally { _semaphoreSlim.Release(); } private void DoWork(){ try { await _semaph
SemaphoreSlim
的类,它使用SemaphoreSlim
调用另一个类。它运行时没有死锁或争用条件
这方面的一般指导方针是什么
try
{
await _semaphoreSlim.WaitAsync();
DoWork();
}
catch (Exception e)
{
}
finally
{
_semaphoreSlim.Release();
}
private void DoWork(){
try
{
await _semaphoreSlim2.WaitAsync();
//more work
}
catch (Exception e)
{
}
finally
{
_semaphoreSlim2.Release();
}
}
在本例中,您将使用
信号量lim
作为一种“互斥”(“互斥”)原语
每个互斥锁都应用于保护一组特定的数据。因此,对不同的数据集使用不同的互斥体是合适的。一般来说,细粒度互斥比粗粒度互斥要好
当您处理多个互斥体时,您希望始终确保以相同的顺序获取它们。您的示例中的代码包含
\u semaphoreSlim
,然后调用获取\u semaphoreSlim2
的代码。这很好,但您应该记录它,因为您永远不希望保存\u信号量lim2
的代码调用获取\u信号量lim
的代码。这可能会导致死锁。您还需要确保锁总是以相同的顺序获取的,因此如果其他人可以调用DoWork,而DoWork内部的某些东西可能最终调用您的顶层代码块,那么您就有相反的顺序和死锁的可能 “一般来说,细粒度互斥比粗粒度互斥好。”你说的FG互斥和CG互斥是什么意思?每个互斥都应该负责保护最少的数据量。所以“细粒度”意味着有更多的互斥体,每个互斥体负责更少的数据量;“过程粒度”意味着负责大量数据的互斥体更少。我知道这是真的。所以是有限的,我应该能够给出更多的答案。