Un exemple simple en C# qui utilise des threads et un Mutex (mutual exclusion) pour synchroniser l'accès à une ressource partagée :
using System;
using System.Threading; class Program
{
static Mutex mutex = new Mutex(); // Création d'un Mutex static void Main(string[] args)
{
// Création de deux threads qui vont accéder à une ressource partagée
Thread t1 = new Thread(DoWork);
Thread t2 = new Thread(DoWork); t1.Start();
t2.Start(); t1.Join();
t2.Join(); Console.WriteLine("Travail terminé.");
Console.ReadKey();
} static void DoWork()
{
mutex.WaitOne(); // Demande d'accès au Mutex try
{
// Section critique : accès à la ressource partagée
Console.WriteLine("Thread {0} est en train de travailler.", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(1000); // Simule un travail en cours
}
finally
{
mutex.ReleaseMutex(); // Libération du Mutex
}
}
}
``` Dans cet exemple, nous avons une classe `Program` avec une méthode `Main` qui crée deux threads (`t1` et `t2`) qui exécutent la méthode `DoWork`. La méthode `DoWork` est la méthode exécutée par chaque thread. Avant d'entrer dans la section critique (la partie où la ressource partagée est utilisée), chaque thread appelle `WaitOne` sur le Mutex. Cela garantit qu'un seul thread à la fois peut accéder à la ressource partagée. Une fois le travail terminé dans la section critique, le thread appelle `ReleaseMutex` pour libérer le Mutex et permettre à d'autres threads d'y accéder.
using System;
using System.Threading; class Program
{
static Mutex mutex = new Mutex(); // Création d'un Mutex static void Main(string[] args)
{
// Création de deux threads qui vont accéder à une ressource partagée
Thread t1 = new Thread(DoWork);
Thread t2 = new Thread(DoWork); t1.Start();
t2.Start(); t1.Join();
t2.Join(); Console.WriteLine("Travail terminé.");
Console.ReadKey();
} static void DoWork()
{
mutex.WaitOne(); // Demande d'accès au Mutex try
{
// Section critique : accès à la ressource partagée
Console.WriteLine("Thread {0} est en train de travailler.", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(1000); // Simule un travail en cours
}
finally
{
mutex.ReleaseMutex(); // Libération du Mutex
}
}
}
``` Dans cet exemple, nous avons une classe `Program` avec une méthode `Main` qui crée deux threads (`t1` et `t2`) qui exécutent la méthode `DoWork`. La méthode `DoWork` est la méthode exécutée par chaque thread. Avant d'entrer dans la section critique (la partie où la ressource partagée est utilisée), chaque thread appelle `WaitOne` sur le Mutex. Cela garantit qu'un seul thread à la fois peut accéder à la ressource partagée. Une fois le travail terminé dans la section critique, le thread appelle `ReleaseMutex` pour libérer le Mutex et permettre à d'autres threads d'y accéder.
Aucun commentaire:
Enregistrer un commentaire