C#多线程同步---使用Semaphore类

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5: using System.Threading;
   6: using System.Diagnostics;
   7:  
   8: namespace Semaphore
   9: {
  10:     class Program
  11:     {
  12:         static void Main(string[] args)
  13:         {
  14:             int threadCount = 6;
  15:             int semaphoreCount = 4;
  16:             var semaphore = new SemaphoreSlim(semaphoreCount,semaphoreCount);
  17:             var threads = new Thread[threadCount];
  18:  
  19:             for (int i = 0; i < threadCount;i++ )
  20:             {
  21:                 threads[i] = new Thread(ThreadMain);
  22:                 threads[i].Start(semaphore);
  23:             }
  24:  
  25:             for (int i = 0; i < threadCount;i++ )
  26:             {
  27:                 threads[i].Join();
  28:             }
  29:  
  30:             Console.WriteLine("All threads finished");
  31:         }
  32:  
  33:         static void ThreadMain(object o)
  34:         {
  35:             SemaphoreSlim semaphore = o as SemaphoreSlim;
  36:             Trace.Assert(semaphore!=null,"o must be a Semaphore type");
  37:             bool isCompleted = false;
  38:             while(!isCompleted)
  39:             {
  40:                 if(semaphore.Wait(600))
  41:                 {
  42:                     try
  43:                     {
  44:                         Console.WriteLine("Thread {0} locks the semaphore", Thread.CurrentThread.ManagedThreadId);
  45:                         Thread.Sleep(2000);
  46:                     }
  47:                     finally
  48:                     {
  49:                         semaphore.Release();
  50:                         Console.WriteLine("Thread {0} releases the semaphore",Thread.CurrentThread.ManagedThreadId);
  51:                         isCompleted = true;
  52:                     }
  53:                 }
  54:                 else
  55:                 {
  56:                     Console.WriteLine("Timeout for thread {0}:wait again", Thread.CurrentThread.ManagedThreadId);
  57:                 }
  58:             }
  59:             Console.Read();
  60:         }
  61:     }
  62: }
posted @ 2012-12-12 14:47  美梦成真  阅读(311)  评论(0编辑  收藏  举报