Csharp/CSharp Tutorial/Thread/Semaphore
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.