Csharp/CSharp Tutorial/Thread/Semaphore — различия между версиями

Материал из .Net Framework эксперт
Перейти к: навигация, поиск
м (1 версия)
 
(нет различий)

Текущая версия на 15:20, 26 мая 2010

Use a Semaphore

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

class MyThread {

 public Thread thrd; 

 static Semaphore sem = new Semaphore(2, 2); 
 
 public MyThread(string name) {  
   thrd = new Thread(this.run);  
   thrd.Name = name;  
   thrd.Start();  
 }  
 
 void run() {  
   Console.WriteLine(thrd.Name + " is waiting for a permit."); 

   sem.WaitOne(); 

   Console.WriteLine(thrd.Name + " acquires a permit."); 

   for(int i=0;i<10;i++) { 
     Console.WriteLine(thrd.Name + " : " + i); 
     Thread.Sleep(50);  
   } 
 
   Console.WriteLine(thrd.Name + " releases a permit."); 

   sem.Release(); 
 }  

}


class MainClass {

 public static void Main() {  
   MyThread mt1 = new MyThread("Thread #1");  
   MyThread mt2 = new MyThread("Thread #2");  
   MyThread mt3 = new MyThread("Thread #3");  
 
   mt1.thrd.Join(); 
   mt2.thrd.Join(); 
   mt3.thrd.Join(); 
 }  

}</source>

Thread #1 is waiting for a permit.
Thread #1 acquires a permit.
Thread #1 : 0
Thread #2 is waiting for a permit.
Thread #2 acquires a permit.
Thread #2 : 0
Thread #3 is waiting for a permit.
Thread #1 : 1
Thread #2 : 1
Thread #1 : 2
Thread #2 : 2
Thread #1 : 3
Thread #2 : 3
Thread #2 : 4
Thread #1 : 4
Thread #2 : 5
Thread #1 : 5
Thread #2 : 6
Thread #1 : 6
Thread #1 : 7
Thread #2 : 7
Thread #1 : 8
Thread #2 : 8
Thread #1 : 9
Thread #2 : 9
Thread #1 releases a permit.
Thread #3 acquires a permit.
Thread #3 : 0
Thread #2 releases a permit.
Thread #3 : 1
Thread #3 : 2
Thread #3 : 3
Thread #3 : 4
Thread #3 : 5
Thread #3 : 6
Thread #3 : 7
Thread #3 : 8
Thread #3 : 9
Thread #3 releases a permit.