LockRecursionPolicy Enumeráció
Definíció
Fontos
Egyes információk olyan, kiadás előtti termékekre vonatkoznak, amelyek a kiadásig még jelentősen módosulhatnak. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.
Azt határozza meg, hogy egy zárolás többször is beírható-e ugyanahhoz a szálhoz.
public enum class LockRecursionPolicy
public enum LockRecursionPolicy
type LockRecursionPolicy =
Public Enum LockRecursionPolicy
- Öröklődés
Mezők
| Name | Érték | Description |
|---|---|---|
| NoRecursion | 0 | Ha egy szál rekurzív módon próbál meg zárolást megadni, a rendszer kivételt jelez. Egyes osztályok bizonyos ismétlődéseket engedélyezhetnek, ha ez a beállítás érvényben van. |
| SupportsRecursion | 1 | A szálak rekurzív módon léphetnek be a zárolásba. Egyes osztályok korlátozhatják ezt a képességet. |
Példák
Az alábbi példa két kivételforgatókönyvet mutat be, az egyik a LockRecursionPolicy beállítástól függ, a másikat pedig nem.
Az első forgatókönyvben a szál olvasási módban lép be a zárolásba, majd rekurzív módon próbál meg bemenni az olvasási módba. Ha a ReaderWriterLockSlim paraméter nélküli konstruktor használatával jön létre, amely a rekurziós szabályzatot NoRecursion-re állítja, a rendszer kivételt jelez. Ha a SupportsRecursion parancsot használja a ReaderWriterLockSlimlétrehozáshoz, a rendszer nem ad kivételt.
A második forgatókönyvben a szál olvasási módban lép be a zárolásba, majd írási módban próbál meg belépni a zárolásba. LockRecursionException a zárolási rekurziós szabályzattól függetlenül történik.
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.
'
Megjegyzések
Az alapértelmezett rekurziós szabályzat a zárolás típusától függ. Az alapértelmezett szabályzatot és a zárolási rekurzió pontos viselkedését az adott zárolási típushoz lásd a típus dokumentációjában. Az osztály például nem engedélyezi, hogy egy ReaderWriterLockSlim szál írási módban lépjen be a zárolásba, ha már belépett olvasási módban, a zárolási házirend beállításától függetlenül, hogy csökkentse a holtpontok esélyét.
Jelenleg csak egy zárolás használja ezt az enumerálást:
- ReaderWriterLockSlim. További információért lásd a RecursionPolicy tulajdonságot.