Csharp/CSharp Tutorial/Thread/Mutex

Материал из .Net Framework эксперт
Версия от 15:20, 26 мая 2010; Admin (обсуждение | вклад) (1 версия)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Name a Mutex

<source lang="csharp">using System; using System.Threading; class MainClass {

 public static void Main( string[] args ) {
   string mutexName = "MainClass";
   Mutex m = new Mutex( false, mutexName );
   for( ;; ) {
     m.WaitOne( );
     Console.WriteLine("Have Mutex");
     Console.WriteLine("Releasing");
     m.ReleaseMutex( );
   }
 }

}</source>

Have Mutex
Releasing
Have Mutex
Releasing
...
...
^CTerminate batch job (Y/N)? n

Own a Mutex

<source lang="csharp">using System; using System.Threading; class MainClass {

   public static void Main()
   {
       bool ownsMutex;
       using (Mutex mutex =new Mutex(true, "MutexExample", out ownsMutex))
       {
           if (ownsMutex)
           {
               Console.WriteLine("Owned");
               mutex.ReleaseMutex();
           }
           else
           {
               Console.WriteLine("Another instance of this application " +
                   " already owns the mutex named MutexExample.");
           }
       }
   }

}</source>

Owned

Threading with Mutex

<source lang="csharp">using System; using System.Collections; using System.Threading; class MainClass {

 public static ArrayList MyList = new ArrayList();
 private static Mutex MyMutex = new Mutex(false, "MyMutex");
 static void Main(string[] args)
 {
     Thread ThreadOne = new Thread(new ThreadStart(MutexExample));
   ThreadOne.Start();
 }
 protected static void MutexExample()
 {
   MyMutex.WaitOne();
   MyList.Add(" a value");
   MyMutex.ReleaseMutex();
 }

}</source>

Use a Mutex to control a shared resource against two current threads

<source lang="csharp">using System; using System.Threading;

class MyCounter {

 public static int count = 0; 
 public static Mutex MuTexLock = new Mutex(); 

}

class IncThread {

 public Thread thrd;  
 
 public IncThread() {  
   thrd = new Thread(this.run);  
   thrd.Start();  
 }  
 
 void run() {  
   Console.WriteLine("IncThread is waiting for the mutex."); 

   MyCounter.MuTexLock.WaitOne(); 

   Console.WriteLine("IncThread acquires the mutex."); 
   
   int num = 10;
   do {  
     Thread.Sleep(50);  
     MyCounter.count++;  
     Console.WriteLine("In IncThread, MyCounter.count is " + MyCounter.count);  
     num--; 
   } while(num > 0);  
 
   Console.WriteLine("IncThread releases the mutex.");   

   MyCounter.MuTexLock.ReleaseMutex(); 
 }  

}

class DecThread {

 public Thread thrd;  
 
 public DecThread() {  
   thrd = new Thread(new ThreadStart(this.run));  
   thrd.Start();  
 }  
 
 void run() {  
   Console.WriteLine("DecThread is waiting for the mutex."); 

   MyCounter.MuTexLock.WaitOne(); 

   Console.WriteLine("DecThread acquires the mutex."); 

   int num = 10;
   do {  
     Thread.Sleep(50);  
     MyCounter.count--;  
     Console.WriteLine("In DecThread, MyCounter.count is " + MyCounter.count);  
     num--; 
   } while(num > 0);  
 
   Console.WriteLine("DecThread releases the mutex.");  

   MyCounter.MuTexLock.ReleaseMutex(); 
 }  

}

class MainClass {

 public static void Main() {  
   IncThread mt1 = new IncThread();  
   DecThread mt2 = new DecThread();  
 
   mt1.thrd.Join(); 
   mt2.thrd.Join(); 
 }  

}</source>

IncThread is waiting for the mutex.
IncThread acquires the mutex.
DecThread is waiting for the mutex.
In IncThread, MyCounter.count is 1
In IncThread, MyCounter.count is 2
In IncThread, MyCounter.count is 3
In IncThread, MyCounter.count is 4
In IncThread, MyCounter.count is 5
In IncThread, MyCounter.count is 6
In IncThread, MyCounter.count is 7
In IncThread, MyCounter.count is 8
In IncThread, MyCounter.count is 9
In IncThread, MyCounter.count is 10
IncThread releases the mutex.
DecThread acquires the mutex.
In DecThread, MyCounter.count is 9
In DecThread, MyCounter.count is 8
In DecThread, MyCounter.count is 7
In DecThread, MyCounter.count is 6
In DecThread, MyCounter.count is 5
In DecThread, MyCounter.count is 4
In DecThread, MyCounter.count is 3
In DecThread, MyCounter.count is 2
In DecThread, MyCounter.count is 1
In DecThread, MyCounter.count is 0
DecThread releases the mutex.

Use the Mutex object: WaitOne

<source lang="csharp">using System; using System.Threading; class MainClass {

 private static int Runs = 0;
 static Mutex mtx = new Mutex(false, "RunsMutex");
 public static void CountUp() 
 {
   while (Runs < 10)
   {
     // acquire the mutex
     mtx.WaitOne();
     int Temp = Runs;
     Temp++;
     Console.WriteLine(Thread.CurrentThread.Name + " " + Temp);
     Thread.Sleep(1000);
     Runs = Temp;
     // release the mutex
     mtx.ReleaseMutex();
   } 
 }
 public static void Main() 
 {
   Thread t2 = new Thread(new ThreadStart(CountUp));
   t2.Name = "t2";
   Thread t3 = new Thread(new ThreadStart(CountUp));
   t3.Name = "t3";
   t2.Start();
   t3.Start();
 }

}</source>

t2 1
t3 2
t3 3
t3 4
t3 5
t3 6
t3 7
t3 8
t3 9
t3 10
t2 11