LockRecursionPolicy Enum

Definition

Gibt an, ob eine Sperre mehrmals dem gleichen Thread zugewiesen werden kann.Specifies whether a lock can be entered multiple times by the same thread.

public enum class LockRecursionPolicy
public enum LockRecursionPolicy
type LockRecursionPolicy = 
Public Enum LockRecursionPolicy
Inheritance
LockRecursionPolicy

Fields

NoRecursion 0

Wenn ein Thread rekursiv versucht, eine Sperre zu erhalten, wird eine Ausnahme ausgelöst.If a thread tries to enter a lock recursively, an exception is thrown. Einige Klassen gestatten gewisse Rekursionen, wenn diese Einstellung aktiv ist.Some classes may allow certain recursions when this setting is in effect.

SupportsRecursion 1

Ein Thread kann rekursiv eine Sperre erhalten.A thread can enter a lock recursively. Einige Klassen beschränken diese Möglichkeit einer rekursiven Zuweisung.Some classes may restrict this capability.

Examples

Das folgende Beispiel zeigt zwei Ausnahme Szenarios, eine, die von der LockRecursionPolicy Einstellung abhängt, und eine, die nicht ist.The following example shows two exception scenarios, one that depends on the LockRecursionPolicy setting and one that does not.

Im ersten Szenario wechselt der Thread in die Sperre im Lesemodus und versucht dann rekursiv in den Lesemodus zu wechseln.In the first scenario, the thread enters the lock in read mode and then tries to enter read mode recursively. Wenn die ReaderWriterLockSlim mit dem Parameter losen Konstruktor erstellt wird, mit dem die Rekursions Richtlinie auf NoRecursion festgelegt wird, wird eine Ausnahme ausgelöst.If the ReaderWriterLockSlim is created by using the parameterless constructor, which sets recursion policy to NoRecursion, an exception is thrown. Wenn SupportsRecursion verwendet wird, um den ReaderWriterLockSlimzu erstellen, wird keine Ausnahme ausgelöst.If SupportsRecursion is used to create the ReaderWriterLockSlim, no exception is thrown.

Im zweiten Szenario wechselt der Thread in den Lesemodus und versucht dann, die Sperre im Schreibmodus einzugeben.In the second scenario, the thread enters the lock in read mode and then tries to enter the lock in write mode. LockRecursionException wird unabhängig von der sperrrekursions Richtlinie ausgelöst.LockRecursionException is thrown regardless of the lock recursion policy.

using System;
using System.Threading;

class Example
{
    // By default, the lock recursion policy for a new 
    // ReaderWriterLockSlim does not allow recursion.
    private static ReaderWriterLockSlim rwls = new ReaderWriterLockSlim();
    private static ReaderWriterLockSlim rwlsWithRecursion =
        new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);

    static void ThreadProc()
    { 
        Console.WriteLine("1. Enter the read lock recursively.");
        ReadRecursive(rwls);
        ReadRecursive(rwlsWithRecursion);

        Console.WriteLine("\n2. Enter the write lock recursively from the read lock.");
        ReadWriteRecursive(rwls);
        ReadWriteRecursive(rwlsWithRecursion);
    } 

    static void ReadRecursive(ReaderWriterLockSlim rwls)
    {
        Console.WriteLine("LockRecursionPolicy.{0}:", rwls.RecursionPolicy);
        rwls.EnterReadLock();

        try {
            rwls.EnterReadLock();
            Console.WriteLine("\nThe read lock was entered recursively.");
            rwls.ExitReadLock();
        }    
        catch (LockRecursionException lre) {
            Console.WriteLine("\n{0}: {1}",
                lre.GetType().Name, lre.Message);
        }

        rwls.ExitReadLock();
    }

    static void ReadWriteRecursive(ReaderWriterLockSlim rwls)
    {
        Console.WriteLine("LockRecursionPolicy.{0}:", rwls.RecursionPolicy);
        rwls.EnterReadLock();

        try {
            rwls.EnterWriteLock();
            Console.WriteLine("\nThe write lock was entered recursively.");
        }
        catch (LockRecursionException lre) {
            Console.WriteLine("\n{0}: {1}", 
                lre.GetType().Name, lre.Message);
        }

        rwls.ExitReadLock();
    }

    static void Main() 
    {
        Thread t = new Thread(ThreadProc);
        t.Start();
        t.Join();
        
        // Dispose of ReaderWriterLockSlim objects' unmanaged resources.
        if (rwls != null) rwls.Dispose();
        if (rwlsWithRecursion != null) rwlsWithRecursion.Dispose();
    } 
} 
// This example displays output similar to the following:
//    1. Enter the read lock recursively.
//    LockRecursionPolicy.NoRecursion:
//    
//    LockRecursionException: Recursive read lock acquisitions not allowed in this mode.
//    LockRecursionPolicy.SupportsRecursion:
//    
//    The read lock was entered recursively.
//    
//    2. Enter the write lock recursively from the read lock.
//    LockRecursionPolicy.NoRecursion:
//    
//    LockRecursionException: Write lock may not be acquired with read lock held. This pattern i
//    s prone to deadlocks. Please ensure that read locks are released before taking a write loc
//    k. If an upgrade is necessary, use an upgrade lock in place of the read lock.
//    LockRecursionPolicy.SupportsRecursion:
//    
//    LockRecursionException: Write lock may not be acquired with read lock held. This pattern i
//    s prone to deadlocks. Please ensure that read locks are released before taking a write loc
//    k. If an upgrade is necessary, use an upgrade lock in place of the read lock.
Imports System.Threading

Class Example
    ' By default, the lock recursion policy for a new 
    ' ReaderWriterLockSlim does not allow recursion.
    Private Shared rwls As New ReaderWriterLockSlim()
    Private Shared rwlsWithRecursion _
        As New ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion)
    
    Shared Sub ThreadProc() 
        
        Console.WriteLine("1. Enter the read lock recursively.")
        ReadRecursive(rwls)
        ReadRecursive(rwlsWithRecursion)
    
        Console.WriteLine(vbCrLf & _
            "2. Enter the write lock recursively from the read lock.")
        ReadWriteRecursive(rwls)
        ReadWriteRecursive(rwlsWithRecursion)

    End Sub 

    Shared Sub ReadRecursive(ByVal rwls As ReaderWriterLockSlim)

        Console.WriteLine("LockRecursionPolicy.{0}:", rwls.RecursionPolicy)
        rwls.EnterReadLock()
        
        Try
            rwls.EnterReadLock()
            Console.WriteLine(vbTab & _
                "The read lock was entered recursively.")
            rwls.ExitReadLock()
        Catch lre As LockRecursionException
            Console.WriteLine(vbTab & "{0}: {1}", _
                lre.GetType().Name, lre.Message)
        End Try

        rwls.ExitReadLock()
    End Sub

    Shared Sub ReadWriteRecursive(ByVal rwls As ReaderWriterLockSlim)

        Console.WriteLine("LockRecursionPolicy.{0}:", rwls.RecursionPolicy)
        rwls.EnterReadLock()

        Try
            rwls.EnterWriteLock()
            Console.WriteLine(vbTab & _
                "The write lock was entered recursively.")
        Catch lre As LockRecursionException
            Console.WriteLine(vbTab & "{0}: {1}", _
                lre.GetType().Name, lre.Message)
        End Try

        rwls.ExitReadLock()
    End Sub
    
    Shared Sub Main() 

        Dim t As New Thread(AddressOf ThreadProc)
        t.Start()
        t.Join()

        ' Dispose of ReaderWriterLockSlim objects' unmanaged resources.
        If rwls IsNot Nothing Then rwls.Dispose()
        If rwlsWithRecursion IsNot Nothing Then _
           rwlsWithRecursion.Dispose()
    End Sub 
End Class 

' This code example produces output similar to the following:
'
'1. Enter the read lock recursively.
'LockRecursionPolicy.NoRecursion:
'        LockRecursionException: Recursive read lock acquisitions not allowed in this mode.
'LockRecursionPolicy.SupportsRecursion:
'        The read lock was entered recursively.
'
'2. Enter the write lock recursively from the read lock.
'LockRecursionPolicy.NoRecursion:
'        LockRecursionException: Write lock may not be acquired with read lock held. This pattern is prone to deadlocks. Consider using the upgrade lock.
'LockRecursionPolicy.SupportsRecursion:
'        LockRecursionException: Write lock may not be acquired with read lock held. This pattern is prone to deadlocks. Consider using the upgrade lock.
' 

Remarks

Die Standard-Rekursions Richtlinie hängt vom Typ der Sperre ab.The default recursion policy depends on the type of lock. Die Standard Richtlinie und das genaue Verhalten der Sperr Rekursion für einen beliebigen Sperrentyp finden Sie in der Dokumentation für den-Typ.For the default policy and the precise behavior of lock recursion for any given lock type, see the documentation for the type. Beispielsweise lässt die ReaderWriterLockSlim-Klasse nicht zu, dass ein Thread die Sperre im Schreibmodus eingibt, wenn die Sperre bereits in den Lesemodus eingetreten ist, und zwar unabhängig von der Einstellung der Sperr Richtlinie, um die Wahrscheinlichkeit von Deadlocks zu verringern.For example, the ReaderWriterLockSlim class does not allow a thread to enter the lock in write mode if it already entered the lock in read mode, regardless of the lock policy setting, in order to reduce the chance of deadlocks.

Zurzeit verwendet nur eine Sperre diese Enumeration:Currently only one lock uses this enumeration:

Applies to