lock, instruction (C#)

Guide de référence du programmeur C# 
lock, instruction (référence C#) 

Le mot clé lock marque un bloc d'instructions comme section critique en assurant le verrouillage par exclusion mutuelle d'un objet particulier, en exécutant une instruction, puis en annulant le verrouillage. Cette instruction prend la forme suivante :



Object thisLock = new Object();
lock (thisLock)
{
    // Critical code section
}

Pour plus d'informations, consultez Synchronisation de threads (guide de programmation C#).

NotesNotes

lock permet de s'assurer qu'un thread n'entre pas dans une section critique du code pendant qu'un autre thread s'y trouve. Si un autre thread tente d'entrer dans un code verrouillé, il attendra, bloquera, jusqu'à ce que l'objet soit libéré.

La section Thread (guide de programmation C#) traite du threading.

lock appelle Enter au début du bloc et Exit à la fin du bloc.

En général, évitez de verrouiller un type public, ou des instances échappant au contrôle de votre code. Les constructions courantes lock (this), lock (typeof (MyType)) et lock ("myLock") violent cette directive :

  • lock (this) pose problème s'il est possible d'accéder publiquement à l'instance.

  • lock (typeof (MyType)) pose problème s'il est possible d'accéder publiquement à MyType.

  • lock(?myLock?) pose problème puisque tout autre code du processus utilisant la même chaîne partagera le même verrouillage.

La méthode conseillée consiste à définir un objet private à verrouiller, ou une variable objet private shared pour protéger des données communes à toutes les instances.

ExempleExemple

L'exemple suivant montre une utilisation simple des threads en C#.



// statements_lock.cs
using System;
using System.Threading;

class ThreadTest
{
    public void RunMe()
    {
        Console.WriteLine("RunMe called");
    }

    static void Main()
    {
        ThreadTest b = new ThreadTest();
        Thread t = new Thread(b.RunMe);
        t.Start();
    }
}

Sortie

RunMe called

L'exemple suivant utilise des threads et lock. Tant que l'instruction lock est présente, le bloc d'instructions est une section critique et balance ne deviendra jamais un nombre négatif.



// statements_lock2.cs
using System;
using System.Threading;

class Account
{
    private Object thisLock = new Object();
    int balance;

    Random r = new Random();

    public Account(int initial)
    {
        balance = initial;
    }

    int Withdraw(int amount)
    {

        // This condition will never be true unless the lock statement
        // is commented out:
        if (balance < 0)
        {
            throw new Exception("Negative Balance");
        }

        // Comment out the next line to see the effect of leaving out 
        // the lock keyword:
        lock(thisLock)
        {
            if (balance >= amount)
            {
                Console.WriteLine("Balance before Withdrawal :  " + balance);
                Console.WriteLine("Amount to Withdraw        : -" + amount);
                balance = balance - amount;
                Console.WriteLine("Balance after Withdrawal  :  " + balance);
                return amount;
            }
            else
            {
                return 0; // transaction rejected
            }
        }
    }

    public void DoTransactions()
    {
        for (int i = 0; i < 100; i++)
        {
            Withdraw(r.Next(1, 100));
        }
    }
}

class Test
{
    static void Main()
    {
        Thread[] threads = new Thread[10];
        Account acc = new Account(1000);
        for (int i = 0; i < 10; i++)
        {
            Thread t = new Thread(new ThreadStart(acc.DoTransactions));
            threads[i] = t;
        }
        for (int i = 0; i < 10; i++)
        {
            threads[i].Start();
        }
    }
}
Spécification du langage C#Spécification du langage C#

Pour plus d'informations, consultez les sections suivantes dans Spécifications du langage C#.

  • 5.3.3.18 Instructions lock

  • 8.12 L'instruction lock


Ces informations proviennent du site de http://msdn2.microsoft.com
Source de cette page : http://msdn2.microsoft.com/fr-fr/library/c5kehkcz.aspx

Réseaux sociaux

Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher les interactions avec les réseaux sociaux sur ces pages.

 

Nuage de mots clés

6 mots clés dont 0 définis manuellement (plus d'information...).

Avertissement

Cette page ne possède pas encore de mots clés manuels, ceci est donc un exemple automatique (les niveaux de pertinence sont fictifs, mais les liens sont valables). Pour tester le nuage avec une page qui contient des mots définis manuellement, vous pouvez cliquer ici.

Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher le nuage de mots clés.

 

Astuce pour imprimer les couleurs des cellules de tableaux : http://www.gaudry.be/ast-rf-450.html
Aucun commentaire pour cette page

© Ce document issu de l′infobrol est enregistré sous le certificat Cyber PrInterDeposit Digital Numbertection. Enregistrement IDDN n° 5329-4833
Document créé le 30/10/06 01:34, dernière modification le Vendredi 17 Juin 2011, 12:11
Source du document imprimé : http://www.gaudry.be/dotnet-rf-c5kehkcz.html Document affiché 6 fois ce mois de Mai.
St.Gaudry©07.01.02
Outils (masquer)
||
Recherche (afficher)
Recherche :

Utilisateur (masquer)
Navigation (masquer)
Apparence (afficher)
Stats (afficher)
15832 documents
452 astuces.
549 niouzes.
3099 definitions.
447 membres.
8115 messages.

Document genere en :
1,16 seconde

Mises à jour :
Mises à jour du site
Citation (masquer)
Le génie commence les beaux ouvrages, mais le travail seul les achève.

Joseph Joubert
 
l'infobrol
Nous sommes le Jeudi 31 Mai 2012, 12:19, toutes les heures sont au format GMT+1.00 Heure, heure d'été (+1)