本文转自http://www.cnblogs.com/tianzhiliang/archive/2010/08/31/1813635.html

信号量 Semaphore

类似互斥锁,但它可以允许多个线程同时访问一个共享资源

通过使用一个计数器来控制对共享资源的访问,如果计数器大于0,就允许访问,如果等于0,就拒绝访问。计数器累计的是“许可证”的数目,为了访问某个资源。线程必须从信号量获取一个许可证。

通常在使用信号量时,希望访问共享资源的线程将尝试获取一个许可证,如果信号量的计数器大于0,线程将获取一个许可证并将信号量的计数器减1,否则先线程将阻塞,直到获取一个许可证;当线程不再需要共享资源时,将释放锁拥有的许可证,并将许可证的数量加1,如果有其他的线程正在等待许可证,那么该线程将立刻获取许可证。

另外,允许同时访问的资源的进程数量是在创建信号量时指定的,如果创建一个允许进程访问的信号量数目为1,则该信号量就和互斥锁的用法一样。

Public Semaphore(int initialCount,int maximumCount)

initialCount指信号量许可证的初始值,maximumCount为最大值

获取许可证使用WaitOne()

不需要时释放使用 public int Release();或者public int Release(int  releaseCount);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace MyTTCon
{
    class mythread
    {
        public Thread thrd;
        //创建一个可授权2个许可证的信号量,且初始值为2
        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 + "正在等待一个许可证……");
            //申请一个许可证
            sem.WaitOne();
            Console.WriteLine(thrd.Name + "申请到许可证……");
            for (int i = 0; i < 4 ; i++)
            {
                Console.WriteLine(thrd.Name + ": " + i);
                Thread.Sleep(1000);
            }
            Console.WriteLine(thrd.Name + " 释放许可证……");
            //释放
            sem.Release();
        }
    }
    class mysemaphore
    {
        public static void Main()
        {
            mythread mythrd1 = new mythread("Thrd #1");
            mythread mythrd2 = new mythread("Thrd #2");
            mythread mythrd3 = new mythread("Thrd #3");
            mythread mythrd4 = new mythread("Thrd #4");
            mythrd1.thrd.Join();
            mythrd2.thrd.Join();
            mythrd3.thrd.Join();
            mythrd4.thrd.Join();
        }
    }
}

常用知识总结——信号量相关推荐

  1. python中pandas格式_Python学习笔记之数据分析中Pandas常用知识

    前言 Pandas基于两种数据类型:series与dataframe. 一个series是一个一维的数据类型,其中每一个元素都有一个标签.series类似于Numpy中元素带标签的数组.其中,标签可以 ...

  2. Apache的压力测试以及web性能优化的常用知识总结

    这篇文章主要介绍了Apache的压力测试以及web性能优化的常用知识总结,笔记由<构建高性能web站点>这本高人气书籍整理而来,需要的朋友可以参考下  什么是带宽? 误解:"数据 ...

  3. Oracle常用知识

    文章目录 Oracle常用知识 创建临时表空间 创建数据表空间 创建用户并指定表空间 修改用户默认表空间 查询用户以及用户对应的表空间 查询当前用户的所有表及表空间 为用户授予权限 查看当前用户权限 ...

  4. 光模块、连接器、光纤的常用知识

    光模块的常用知识 以太网交换机常用的光模块有SFP,GBIC,XFP,XENPAK.它们的英文全称,中文名不常用,可以简单了解下 SFP: Small Form-factor Pluggable tr ...

  5. 网络基础:计算机网络由基础到深入常用知识集锦!

    网络技术的发展给社会带来了诸多益处,随着网络的广泛应用,网络给我们带来便利的同时,网络故障也时有发生.本文探讨了计算机网络中常见的网络问题及计算机网络维护方法,保证计算机网络运行稳定. 在日常使用过程 ...

  6. 电脑计算机网络由基础到深入常用知识集锦!

    网络技术的发展给社会带来了诸多益处,随着网络的广泛应用,网络给我们带来便利的同时,网络故障也时有发生.本文探讨了计算机网络中常见的网络问题及计算机网络维护方法,保证计算机网络运行稳定. 在日常使用过程 ...

  7. 计算机网络常用知识笔记(超全面)!

    网络技术的发展给社会带来了诸多益处,随着网络的广泛应用,网络给我们带来便利的同时,网络故障也时有发生.本文探讨了计算机网络中常见的网络问题及计算机网络维护方法,保证计算机网络运行稳定. 在日常使用过程 ...

  8. android ListView常用知识总结

    先来看下项目主要内容: ListView中填充数据: 重现添加数据后置顶,具体阐明了决解方案,如下: 刷新适配器后没有响应的错误现象,具体阐明了决解方案,如下: 正确示范一: 1 2 3 4 5 6 ...

  9. 教师编计算机知识大全,高效老师必要知道的电脑常用知识技巧整理大全

    原标题:高效老师必要知道的电脑常用知识技巧整理大全 与很多老师接触过后,都会发现,老师,真的是个电脑小白-- 白到什么程度? 怎么也想不起来前几天写好的报告存在电脑那哪里了,只好一个文件夹一个文件夹地 ...

最新文章

  1. 解决:sql中将日期字符串当做日期类型处理
  2. tar 和gzip 的区别
  3. android socket_盘点Android常用Hook技术
  4. chrome浏览器如何重新打开关闭的标签页?(快捷键ctrl+shift+t)
  5. poj 1020 深搜
  6. mse均方误差计算公式_PCA的两种解读:方差最大与均方误差最小的推导
  7. caffe学习:Crop 层
  8. 电脑c盘满了怎么清理
  9. 简单的路由封装ppp
  10. 打造高效的运维日志收集与分析平台
  11. 地籍测绘成图软件南方cass9.0支持AutoCad2010【安装文件和视频教程】
  12. PPT 插入表格出现格式如何清除
  13. springboot项目启动后执行方法
  14. 阿里云网盘内测申请_33期——阿里云网盘之内测申请(一)
  15. 你真的知道什么是元音什么是辅音吗?
  16. python中的str()函数
  17. Link-添加网页图标
  18. 【行业介绍】工业自动化行业
  19. 字节跳动核心竞争力到底是什么?
  20. 洛谷 P2327 [SCOI2005]扫雷

热门文章

  1. BZOJ2741 【FOTILE模拟赛】L 【可持久化trie + 分块】
  2. 添加删除 板块 struts2
  3. SQL- AND OR Order by INSERT INTO
  4. 关于mysql内存表的一个帖子(转载)
  5. Linux系统中的load average
  6. OD使用教程3(下) - 调试篇03|解密系列
  7. Leetcode--287. 寻找重复数(Java)
  8. android自定义adapter怎么优化,Android必学-BaseAdapter的使用与优化
  9. python算法实现源码_Python实现七个基本算法
  10. idea整合jboos_在 idea 中 启动 jboss 后, 没有运行部署(通过idea部署)的ssm项目,打开后项目404...