Ce sujet n'a pas encore été évalué - Évaluez ce sujet

Mutex, constructeur (Boolean, String, Boolean%, MutexSecurity)

Mise à jour : novembre 2007

Initialise une nouvelle instance de la classe Mutex avec une valeur Boolean qui indique si le thread appelant doit avoir la propriété initiale du mutex, une chaîne qui représente le nom du mutex et une variable Boolean qui, lorsque la méthode retourne son résultat, indique si la propriété initiale du mutex a été accordée au thread appelant et la sécurité de contrôle d'accès à appliquer au mutex nommé.

Espace de noms :  System.Threading
Assembly :  mscorlib (dans mscorlib.dll)

public Mutex(
	bool initiallyOwned,
	string name,
	out bool createdNew,
	MutexSecurity mutexSecurity
)
public Mutex(
	boolean initiallyOwned,
	String name,
	/** @attribute OutAttribute */ /** @ref */boolean createdNew,
	MutexSecurity mutexSecurity
)
public function Mutex(
	initiallyOwned : boolean, 
	name : String, 
	createdNew : boolean, 
	mutexSecurity : MutexSecurity
)

Paramètres

initiallyOwned
Type : System.Boolean

true pour donner au thread appelant la propriété initiale du mutex système nommé si celui-ci est créé comme conséquence de cet appel ; sinon, false.

name
Type : System.String

Nom du mutex système. Si cette valeur est null, Mutex est sans nom.

createdNew
Type : System.Boolean%

Cette méthode retourne une valeur booléenne qui est true si un mutex local a été créé (en d'autres termes, si name est null ou une chaîne vide) ou si le mutex système nommé spécifié a été créé ; false si le mutex système nommé spécifié existait déjà. Ce paramètre est passé sans être initialisé.

mutexSecurity
Type : System.Security.AccessControl.MutexSecurity

Objet MutexSecurity qui représente la sécurité du contrôle d'accès à appliquer au mutex système nommé.

ExceptionCondition
IOException

Une erreur Win32 s'est produite.

UnauthorizedAccessException

Le mutex nommé existe et possède la sécurité du contrôle d'accès, mais l'utilisateur ne possède pas MutexRights.FullControl.

ApplicationException

Le mutex nommé ne peut pas être créé, peut-être parce qu'un handle d'attente d'un type différent possède le même nom.

ArgumentException

name dépasse 260 caractères.

Si name n'est pas null et que initiallyOwned a la valeur true, le thread appelant possède le mutex nommé uniquement si createdNew a la valeur true après l'appel. Sinon, le thread peut demander le mutex en appelant la méthode WaitOne.

Utilisez ce constructeur pour appliquer la sécurité de contrôle d'accès à un mutex système nommé lors de sa création, en empêchant l'autre code de prendre le contrôle du mutex.

Ce constructeur initialise un objet Mutex qui représente un mutex système nommé. Vous pouvez créer plusieurs objets Mutex qui représentent le même mutex système nommé.

Si le mutex système nommé n'existe pas, il est créé avec la sécurité du contrôle d'accès spécifiée. Si le mutex nommé existe, la sécurité de contrôle d'accès spécifiée est ignorée.

Remarque :

L'appelant a un contrôle total de l'objet Mutex nouvellement créé, même si mutexSecurity refuse ou ne parvient pas à accorder des droits d'accès à l'utilisateur en cours. Toutefois, si l'utilisateur actuel tente d'obtenir un autre objet Mutex pour représenter le même mutex nommé, en utilisant un constructeur ou la méthode OpenExisting, la sécurité de contrôle d'accès Windows est appliquée.

Si le mutex nommé a déjà été créé avec une sécurité de contrôle d'accès et que l'appelant n'a pas MutexRights.FullControl, une exception est levée. Pour ouvrir un mutex nommé existant avec les seules autorisations nécessaires à la synchronisation des activités de thread, consultez la méthode OpenExisting.

Si vous spécifiez null ou une chaîne vide pour name, un mutex local est créé, comme si vous aviez appelé le constructeur Mutex(Boolean). Dans ce cas, createdNew a toujours la valeur true.

Comme ils interviennent à l'échelle du système, les mutex nommés peuvent être utilisés pour coordonner l'utilisation des ressources sur plusieurs processus.

Remarque :

Sur un serveur exécutant des services Terminal Server, un mutex système nommé peut avoir deux niveaux de visibilité. Si son nom commence par le préfixe "Global \", le mutex est visible dans toutes les sessions Terminal Server. Si son nom commence par le préfixe "Local \", le mutex est visible uniquement dans la session Terminal Server où il a été créé. Dans ce cas, un mutex séparé avec le même nom peut exister dans chacune des autres sessions Terminal Server sur le serveur. Si vous ne spécifiez pas de préfixe lorsque vous créez un mutex nommé, il prend le préfixe "Local \". Dans une session Terminal Server, deux mutexes dont les noms diffèrent uniquement par leurs préfixes sont des mutexes séparés, et les deux sont visibles de tous les processus dans la session Terminal Server. Autrement dit, les noms avec préfixe "Global \" et "Local \" décrivent la portée du nom de mutex par rapport aux sessions Terminal Server, et non aux processus.

L'exemple de code suivant illustre le comportement interprocessus d'un mutex nommé avec une sécurité de contrôle d'accès. L'exemple utilise la surcharge de la méthode OpenExisting(String) pour vérifier l'existence d'un mutex nommé.

Si le mutex n'existe pas, il est créé avec la propriété initiale et une sécurité de contrôle d'accès qui n'accorde pas à l'utilisateur actuel le droit d'utiliser le mutex, mais lui permet de le lire et d'en modifier les autorisations.

Si vous exécutez l'exemple compilé à partir de deux fenêtres de commandes, la deuxième copie lèvera une exception de violation d'accès sur l'appel à OpenExisting(String). L'exception est interceptée et l'exemple utilise la surcharge de la méthode OpenExisting(String, MutexRights) pour ouvrir le mutex avec les droits requis pour lire et modifier les autorisations.

Une fois les autorisations modifiées, le mutex est ouvert avec les droits d'entrée et de libération requis. Si vous exécutez l'exemple compilé à partir d'une troisième fenêtre de commandes, il utilise les nouvelles autorisations.

using System;
using System.Threading;
using System.Security.AccessControl;

internal class Example
{
    internal static void Main()
    {
        const string mutexName = "MutexExample4";

        Mutex m = null;
        bool doesNotExist = false;
        bool unauthorized = false;

        // The value of this variable is set by the mutex
        // constructor. It is true if the named system mutex was
        // created, and false if the named mutex already existed.
        //
        bool mutexWasCreated = false;

        // Attempt to open the named mutex.
        try
        {
            // Open the mutex with (MutexRights.Synchronize |
            // MutexRights.Modify), to enter and release the
            // named mutex.
            //
            m = Mutex.OpenExisting(mutexName);
        }
        catch(WaitHandleCannotBeOpenedException)
        {
            Console.WriteLine("Mutex does not exist.");
            doesNotExist = true;
        }
        catch(UnauthorizedAccessException ex)
        {
            Console.WriteLine("Unauthorized access: {0}", ex.Message);
            unauthorized = true;
        }

        // There are three cases: (1) The mutex does not exist.
        // (2) The mutex exists, but the current user doesn't 
        // have access. (3) The mutex exists and the user has
        // access.
        //
        if (doesNotExist)
        {
            // The mutex does not exist, so create it.

            // Create an access control list (ACL) that denies the
            // current user the right to enter or release the 
            // mutex, but allows the right to read and change
            // security information for the mutex.
            //
            string user = Environment.UserDomainName + "\\"
                + Environment.UserName;
            MutexSecurity mSec = new MutexSecurity();

            MutexAccessRule rule = new MutexAccessRule(user, 
                MutexRights.Synchronize | MutexRights.Modify, 
                AccessControlType.Deny);
            mSec.AddAccessRule(rule);

            rule = new MutexAccessRule(user, 
                MutexRights.ReadPermissions | MutexRights.ChangePermissions,
                AccessControlType.Allow);
            mSec.AddAccessRule(rule);

            // Create a Mutex object that represents the system
            // mutex named by the constant 'mutexName', with
            // initial ownership for this thread, and with the
            // specified security access. The Boolean value that 
            // indicates creation of the underlying system object
            // is placed in mutexWasCreated.
            //
            m = new Mutex(true, mutexName, out mutexWasCreated, mSec);

            // If the named system mutex was created, it can be
            // used by the current instance of this program, even 
            // though the current user is denied access. The current
            // program owns the mutex. Otherwise, exit the program.
            // 
            if (mutexWasCreated)
            {
                Console.WriteLine("Created the mutex.");
            }
            else
            {
                Console.WriteLine("Unable to create the mutex.");
                return;
            }

        }
        else if (unauthorized)
        {
            // Open the mutex to read and change the access control
            // security. The access control security defined above
            // allows the current user to do this.
            //
            try
            {
                m = Mutex.OpenExisting(mutexName, 
                    MutexRights.ReadPermissions | MutexRights.ChangePermissions);

                // Get the current ACL. This requires 
                // MutexRights.ReadPermissions.
                MutexSecurity mSec = m.GetAccessControl();

                string user = Environment.UserDomainName + "\\"
                    + Environment.UserName;

                // First, the rule that denied the current user 
                // the right to enter and release the mutex must
                // be removed.
                MutexAccessRule rule = new MutexAccessRule(user, 
                     MutexRights.Synchronize | MutexRights.Modify,
                     AccessControlType.Deny);
                mSec.RemoveAccessRule(rule);

                // Now grant the user the correct rights.
                // 
                rule = new MutexAccessRule(user, 
                    MutexRights.Synchronize | MutexRights.Modify,
                    AccessControlType.Allow);
                mSec.AddAccessRule(rule);

                // Update the ACL. This requires
                // MutexRights.ChangePermissions.
                m.SetAccessControl(mSec);

                Console.WriteLine("Updated mutex security.");

                // Open the mutex with (MutexRights.Synchronize 
                // | MutexRights.Modify), the rights required to
                // enter and release the mutex.
                //
                m = Mutex.OpenExisting(mutexName);

            }
            catch(UnauthorizedAccessException ex)
            {
                Console.WriteLine("Unable to change permissions: {0}",
                    ex.Message);
                return;
            }

        }

        // If this program created the mutex, it already owns
        // the mutex.
        //
        if (!mutexWasCreated)
        {
            // Enter the mutex, and hold it until the program
            // exits.
            //
            try
            {
                Console.WriteLine("Wait for the mutex.");
                m.WaitOne();
                Console.WriteLine("Entered the mutex.");
            }
            catch(UnauthorizedAccessException ex)
            {
                Console.WriteLine("Unauthorized access: {0}", ex.Message);
            }
        }

        Console.WriteLine("Press the Enter key to exit.");
        Console.ReadLine();
        m.ReleaseMutex();
    }
}


Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professionnel Édition x64, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98

Le .NET Framework et le .NET Compact Framework ne prennent pas en charge toutes les versions de chaque plateforme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise du .NET Framework.

.NET Framework

Pris en charge dans : 3.5, 3.0, 2.0
Cela vous a-t-il été utile ?
(1500 caractères restants)

Ajouts de la communauté

AJOUTER
Microsoft réalise une enquête en ligne pour recueillir votre opinion sur le site Web de MSDN. Si vous choisissez d’y participer, cette enquête en ligne vous sera présentée lorsque vous quitterez le site Web de MSDN.

Si vous souhaitez y participer,
© 2013 Microsoft. Tous droits réservés.