Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 嵌套信号量限制、安全性和死锁_C#_.net_.net Core - Fatal编程技术网

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互斥是什么意思?每个互斥都应该负责保护最少的数据量。所以“细粒度”意味着有更多的互斥体,每个互斥体负责更少的数据量;“过程粒度”意味着负责大量数据的互斥体更少。我知道这是真的。所以是有限的,我应该能够给出更多的答案。