LockRecursionPolicy LockRecursionPolicy LockRecursionPolicy LockRecursionPolicy Enum

定義

同じスレッドが複数回ロックに入れるかどうかを指定します。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
継承
LockRecursionPolicyLockRecursionPolicyLockRecursionPolicyLockRecursionPolicy

フィールド

NoRecursion NoRecursion NoRecursion NoRecursion 0

スレッドが、再帰的にロックに入ろうとすると、例外がスローされます。If a thread tries to enter a lock recursively, an exception is thrown. クラスによっては、この設定が適用されている場合に、特定の再帰が認められることがあります。Some classes may allow certain recursions when this setting is in effect.

SupportsRecursion SupportsRecursion SupportsRecursion SupportsRecursion 1

スレッドが再帰的にロックに入ることができます。A thread can enter a lock recursively. クラスによっては、この機能が制限されていることがあります。Some classes may restrict this capability.

次の例は、いずれかに依存している 2 つの例外シナリオ、LockRecursionPolicy設定し、1 つにはないです。The following example shows two exception scenarios, one that depends on the LockRecursionPolicy setting and one that does not.

最初のシナリオでは、スレッドは読み取りモードでロックに入ったし、再帰的に読み取りモードに入ろいます。In the first scenario, the thread enters the lock in read mode and then tries to enter read mode recursively. 場合、ReaderWriterLockSlimが作成される、NoRecursion を再帰ポリシーを設定の既定のコンス トラクターを使用して、例外がスローされます。If the ReaderWriterLockSlim is created by using the default constructor, which sets recursion policy to NoRecursion, an exception is thrown. SupportsRecursion を使用して作成する場合、ReaderWriterLockSlim例外はスローされません。If SupportsRecursion is used to create the ReaderWriterLockSlim, no exception is thrown.

2 番目のシナリオでは、スレッドは、読み取りモードでロックに入ったで、書き込みモードでロックに入るしようとします。In the second scenario, the thread enters the lock in read mode and then tries to enter the lock in write mode. LockRecursionException ロック再帰ポリシーに関係なくがスローされます。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
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.
' 

注釈

既定の再帰ポリシーは、ロックの種類によって異なります。The default recursion policy depends on the type of lock. 既定のポリシーと、指定されたロックの種類のロックの再帰の正確な動作は、型のドキュメントを参照してください。For the default policy and the precise behavior of lock recursion for any given lock type, see the documentation for the type. たとえば、ReaderWriterLockSlimクラスには、既に入力した場合と、ロック、ロックのポリシー設定に関係なく、読み取りモードでデッドロックが発生する可能性を軽減するために書き込みモードでロックに入るスレッドはできません。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.

現在、だけが 1 つのロックは、この列挙体を使用します。Currently only one lock uses this enumeration:

適用対象