Lock Klass

Definition

Tillhandahåller en mekanism för att uppnå ömsesidig uteslutning i kodregioner mellan olika trådar.

public ref class Lock sealed
public sealed class Lock
type Lock = class
Public NotInheritable Class Lock
Arv
Lock

Kommentarer

Klassen Lock kan användas för att definiera kodregioner som kräver ömsesidigt exklusiv åtkomst mellan trådar i en process, som ofta kallas kritiska avsnitt, för att förhindra samtidig åtkomst till en resurs. A Lock kan anges och avslutas, där kodområdet mellan returen och avslutet är ett kritiskt avsnitt som är associerat med låset. En tråd som går in i ett lås sägs hålla eller äga låset tills det lämnar låset. Högst en tråd kan hålla ett lås vid en viss tidpunkt. En tråd kan innehålla flera lås. En tråd kan ange ett lås flera gånger innan den avslutas, till exempel rekursivt. En tråd som inte kan ange ett lås omedelbart kan vänta tills låset kan anges eller tills en angiven tidsgräns upphör att gälla.

När du använder Enter metoderna eller TryEnter för att ange ett lås:

  • Se till att tråden avslutar låset även Exit om det finns undantag, till exempel i C# med hjälp av ett try/finally block.
  • När låset matas in och avslutas i en C# async -metod kontrollerar du att det inte finns någon await mellan returen och avslutet. Lås hålls av trådar och koden som följer en await kan köras på en annan tråd.

Vi rekommenderar att du använder EnterScope metoden med en språkkonstruktion som automatiskt tar bort det returnerade Lock.Scope , till exempel nyckelordet C# using eller använder nyckelordet C# lock eftersom dessa säkerställer att låset avslutas i undantagsfall. Dessa mönster kan också ha prestandafördelar jämfört med att använda Enter/TryEnter och Exit. Följande kodfragment illustrerar olika mönster för att ange och avsluta ett lås.

public sealed class ExampleDataStructure
{
    private readonly Lock _lockObj = new();

    public void Modify()
    {
        lock (_lockObj)
        {
            // Critical section associated with _lockObj
        }

        using (_lockObj.EnterScope())
        {
            // Critical section associated with _lockObj
        }

        _lockObj.Enter();
        try
        {
            // Critical section associated with _lockObj
        }
        finally { _lockObj.Exit(); }

        if (_lockObj.TryEnter())
        {
            try
            {
                // Critical section associated with _lockObj
            }
            finally { _lockObj.Exit(); }
        }
    }
}

När du använder nyckelordet C# lock eller liknande för att ange och avsluta ett lås måste uttryckets typ vara exakt System.Threading.Lock. Om uttryckets typ är något annat, till exempel Object eller en allmän typ som T, kan en annan implementering som inte är utbytbar användas i stället (till exempel Monitor). Mer information finns i relevant kompilatorspecifikation.

Interrupt kan avbryta trådar som väntar på att ange ett lås. På Windows STA-trådar tillåter väntan på lås meddelandepumpning som kan köra annan kod på samma tråd under en väntan. Vissa funktioner i väntetiderna kan åsidosättas av en anpassad SynchronizationContext.

Note

En tråd som går in i ett lås, inklusive flera gånger, till exempel rekursivt, måste avsluta låset samma antal gånger för att helt avsluta låset och låta andra trådar komma in i låset. Om en tråd avslutas medan du håller i en Lockblir beteendet för det Lock odefinierat.

Caution

Om en tråd på en kodsökväg kan ange flera lås innan de avslutas kontrollerar du att alla kodsökvägar som kan ange två av dessa lås i samma tråd anger dem i samma ordning. Annars kan det leda till dödlägen. Tänk till exempel på att på en kodsökvägstråd T1 anger lås L1 och lås L2 innan båda avslutas, och på en annan kodsökvägstråd T2 anges båda låsen i omvänd ordning. I det scenariot skulle det vara möjligt att följande händelseordning inträffar: anger , anger , försöker ange L2 och väntar, T2 försöker ange L1 och vänta. T1L2T2L1T1 Det finns ett dödläge mellan T1 och T2 som inte kan lösas, och andra trådar som försöker ange något av låsen i framtiden kommer också att hänga.

Konstruktorer

Name Description
Lock()

Initierar en ny instans av Lock klassen.

Egenskaper

Name Description
IsHeldByCurrentThread

Hämtar ett värde som anger om låset hålls av den aktuella tråden.

Metoder

Name Description
Enter()

Anger låset och väntar vid behov tills låset kan anges.

EnterScope()

Anger låset och väntar vid behov tills låset kan anges.

Equals(Object)

Avgör om det angivna objektet är lika med det aktuella objektet.

(Ärvd från Object)
Exit()

Avslutar låset.

GetHashCode()

Fungerar som standard-hash-funktion.

(Ärvd från Object)
GetType()

Hämtar den aktuella instansen Type .

(Ärvd från Object)
MemberwiseClone()

Skapar en ytlig kopia av den aktuella Object.

(Ärvd från Object)
ToString()

Returnerar en sträng som representerar det aktuella objektet.

(Ärvd från Object)
TryEnter()

Försöker ange låset utan att vänta.

TryEnter(Int32)

Försöker ange låset och väntar vid behov på det angivna antalet millisekunder tills låset kan anges.

TryEnter(TimeSpan)

Försöker ange låset, väntar vid behov tills låset kan anges eller tills den angivna tidsgränsen upphör att gälla.

Gäller för