技术开发 频道

.NET线程同步的多种实现

  3Semaphore

  限制可同时访问某一资源或资源池的线程数。

  信号量的计数在每次线程进入信号量时减小,在线程释放信号量时增加。当计数为零时,后面的请求将被阻塞,直到有其他线程释放信号量。当所有的线程都已释放信号量时,计数达到创建信号量时所指定的最大值。(MSDN)

  上面代码的Semaphore实现

  class Program

  {

  
//初始化为一个信号量,且最大信号量为1,所以当 _pool.Release(2)时会报错。

  
private static Semaphore _pool = new Semaphore(1, 1);

  static void Main(
string[] args)

  {

  CompareExchange();

  Console.Read();

  }

  static void CompareExchange()

  {

  
for (int i = 0; i < 4; i++)

  {

  Thread tr
= new Thread(doing);

  tr.Start(i);

  }

  }

  static void doing(
object threadName)

  {

  _pool.WaitOne();

  
int i = 0;

  
while (i < 10)

  {

  Thread.Sleep(
100);

  Console.WriteLine(threadName
+ " " + i++);

  }

  Console.WriteLine(threadName
+ "over ");

  
//释放信号量

  _pool.Release();

  }

  }
0
相关文章