Chinaunix首页 | 论坛 | 博客
  • 博客访问: 12525595
  • 博文数量: 1293
  • 博客积分: 13501
  • 博客等级: 上将
  • 技术积分: 17974
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 18:11
文章分类

全部博文(1293)

文章存档

2019年(1)

2018年(1)

2016年(118)

2015年(257)

2014年(128)

2013年(222)

2012年(229)

2011年(337)

分类:

2012-11-07 10:34:31

1、semaphore信号量类(又称信号灯)

用于控制对资源池的访问。线程通过调用semaphore的WaitOne进入信号量,通过调用semaphore的Release方法退出信号量。

 

信号量分为两种类型:局部信号量和已命名的系统信号量。如果您使用接受名称的构造函数创建 Semaphore 对象,则该对象与具有该名称的操作系统信号量关联。已命名的系统信号量在整个操作系统中都可见,可用于同步进程活动。您可以创建多个 Semaphore 对象来表示同一个已命名的系统信号量,也可以使用 OpenExisting 方法打开现有的已命名系统信号量。

局部信号量仅存在于您的进程内。您的进程中任何引用局部 Semaphore 对象的线程都可以使用它。每个 Semaphore 对象都是一个单独的局部信号量。

 

2、示例代码


  1. using System;
  2. using System.Threading;

  3. /*
  4. * 代码示例创建一个最大计数为 3、初始计数为 0 的信号量。此示例启动五个线程,这些线程都将阻止等待该信号量。
  5. * 主线程使用 Release(Int32) 方法重载,以便将信号量计数增加为其最大值,从而允许三个线程进入该信号量。
  6. * 每个线程都使用 Thread..::.Sleep 方法等待一秒钟以便模拟工作,然后调用 Release()()() 方法重载以释放信号量。
  7. * 每次释放信号量时,都显示前一个信号量计数。控制台消息对信号量的使用进行跟踪。
  8. * 每个线程的模拟工作间隔都稍有增加,以使输出更为易读。
  9. */
  10. public class Example
  11. {
  12.     private static Semaphore __pool;
  13.     private static int __padding;

  14.     public static void Main()
  15.     {
  16.         __pool = new Semaphore(0,3); /* 限制最大同时运行值,初始值为0*/

  17.         for(int i = 0; i <= 5; i++)
  18.         {
  19.             Thread t = new Thread(new ParameterizedThreadStart(Worker));
  20.             t.Start(i);
  21.         }
  22.         Thread.Sleep(500);
  23.         Console.WriteLine("主线程调用Release(3)");
  24.         __pool.Release(3);

  25.         Console.WriteLine("主线程退出");
  26.         Console.ReadLine();
  27.     }

  28.     private static void Worker(object num)
  29.     {


 

image

阅读(7322) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~