Lock Classe
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
Fournit un mécanisme permettant d’obtenir une exclusion mutuelle dans les régions du code entre différents threads.
public ref class Lock sealed
public sealed class Lock
type Lock = class
Public NotInheritable Class Lock
- Héritage
-
Lock
Remarques
La Lock classe peut être utilisée pour définir des régions de code qui nécessitent un accès mutuellement exclusif entre les threads d’un processus, communément appelés sections critiques, pour empêcher les accès simultanés à une ressource. Un Lock peut être entré et quitté, où la région du code entre l’entrée et la sortie est une section critique associée au verrou. Un thread qui entre dans un verrou est dit contenir ou posséder le verrou jusqu’à ce qu’il quitte le verrou. Au plus un thread peut contenir un verrou à tout moment. Un thread peut contenir plusieurs verrous. Un thread peut entrer plusieurs fois un verrou avant de le quitter, par exemple de manière récursive. Un thread qui ne peut pas entrer un verrou immédiatement peut attendre que le verrou puisse être entré ou jusqu’à ce qu’un délai d’expiration spécifié expire.
Lors de l’utilisation des méthodes ou TryEnter des Enter méthodes pour entrer un verrou :
- Assurez-vous que le thread quitte le verrou même Exit en cas d’exceptions, comme en C# à l’aide d’un
try/finallybloc. - Lorsque le verrou est entré et quitté dans une méthode C#
async, assurez-vous qu’il n’y a pasawaitentre l’entrée et la sortie. Les verrous sont conservés par des threads et le code suivant peutawaits’exécuter sur un autre thread.
Il est recommandé d’utiliser la EnterScope méthode avec une construction de langage qui supprime automatiquement le mot clé C# using retournéLock.Scope, ou d’utiliser le mot clé C#lock, car elles garantissent que le verrou est quitté dans des cas exceptionnels. Ces modèles peuvent également avoir des avantages en matière de performances par rapport à l’utilisation Enter/TryEnter et Exit. Le fragment de code suivant illustre différents modèles pour entrer et quitter un verrou.
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(); }
}
}
}
Lorsque vous utilisez le mot clé C# lock ou similaire à l’entrée et à la sortie d’un verrou, le type de l’expression doit être précisément System.Threading.Lock. Si le type de l’expression est autre chose, tel qu’un Object type générique comme T, une autre implémentation qui n’est pas interchangeable peut être utilisée à la place (par Monitorexemple). Pour plus d’informations, consultez le speclet du compilateur approprié.
Interrupt peut interrompre les threads qui attendent d’entrer un verrou. Sur Windows threads STA, les attentes pour les verrous autorisent le pompage des messages qui peuvent exécuter d’autres codes sur le même thread pendant une attente. Certaines fonctionnalités des attentes peuvent être remplacées par une commande personnalisée SynchronizationContext.
Note
Un thread qui entre dans un verrou, y compris plusieurs fois comme de manière récursive, doit quitter le verrou le même nombre de fois pour quitter complètement le verrou et autoriser d’autres threads à entrer dans le verrou. Si un thread se ferme tout en tenant un Lock, le comportement de l’élément Lock devient non défini.
Avertissement
Si, sur un chemin de code, un thread peut entrer plusieurs verrous avant de les quitter, assurez-vous que tous les chemins de code susceptibles d’entrer deux de ces verrous sur le même thread les entrent dans le même ordre. Sinon, cela pourrait entraîner des interblocages. Par exemple, considérez que sur un thread T1 de chemin de code entre le verrou L1 , verrou L2 avant de quitter les deux, et sur un autre thread T2 de chemin de code entre les deux verrous dans l’ordre inverse. Dans ce scénario, il serait possible que l’ordre d’événements suivant se produise : T1 entre, entreL1L2, T2T1 tente d’entrer L2 et d’attendre, T2 tente d’entrer L1 et d’attendre. Il existe un interblocage entre T1 et T2 qui ne peut pas être résolu, et tous les autres threads qui essaient d’entrer l’un ou l’autre verrou à l’avenir se bloquent également.
Constructeurs
| Nom | Description |
|---|---|
| Lock() |
Initialise une nouvelle instance de la classe Lock. |
Propriétés
| Nom | Description |
|---|---|
| IsHeldByCurrentThread |
Obtient une valeur qui indique si le verrou est conservé par le thread actuel. |
Méthodes
| Nom | Description |
|---|---|
| Enter() |
Entre dans le verrou, en attendant si nécessaire jusqu’à ce que le verrou puisse être entré. |
| EnterScope() |
Entre dans le verrou, en attendant si nécessaire jusqu’à ce que le verrou puisse être entré. |
| Equals(Object) |
Détermine si l’objet spécifié est égal à l’objet actuel. (Hérité de Object) |
| Exit() |
Quitte le verrou. |
| GetHashCode() |
Sert de fonction de hachage par défaut. (Hérité de Object) |
| GetType() |
Obtient la Type de l’instance actuelle. (Hérité de Object) |
| MemberwiseClone() |
Crée une copie superficielle du Objectactuel. (Hérité de Object) |
| ToString() |
Retourne une chaîne qui représente l’objet actuel. (Hérité de Object) |
| TryEnter() |
Tente d’entrer dans le verrou sans attendre. |
| TryEnter(Int32) |
Tente d’entrer le verrou, en attendant si nécessaire le nombre spécifié de millisecondes jusqu’à ce que le verrou puisse être entré. |
| TryEnter(TimeSpan) |
Tente d’entrer le verrou, en attendant si nécessaire jusqu’à ce que le verrou puisse être entré ou jusqu’à l’expiration du délai d’expiration spécifié. |