转自:蔡军生博文

在开发软件的过程中,多线程的程序往往需要实现相互通讯,比如几个线程添加一个消息到队列里,而另一个线程在睡眠时,就需要唤醒那个线程来处理事情。在这其中,就需要使用到信号量来进行同步。CreateSemaphore是创建信号量,ReleaseSemaphore是增加信号量。
 
函数CreateSemaphore和ReleaseSemaphore声明如下:
WINBASEAPI
__out
HANDLE
WINAPI
CreateSemaphoreA(
    __in_opt LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
    __in     LONG lInitialCount,
    __in     LONG lMaximumCount,
    __in_opt LPCSTR lpName
    );
WINBASEAPI
__out
HANDLE
WINAPI
CreateSemaphoreW(
    __in_opt LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
    __in     LONG lInitialCount,
    __in     LONG lMaximumCount,
    __in_opt LPCWSTR lpName
    );
#ifdef UNICODE
#define CreateSemaphore CreateSemaphoreW
#else
#define CreateSemaphore CreateSemaphoreA
#endif // !UNICODE
 
lpSemaphoreAttributes是信号量的安全属性。
lInitialCount是初始化的信号量。
lMaximumCount是允许信号量增加到最大值。
lpName是信号量的名称。
 
WINAPI
ReleaseSemaphore(
    __in      HANDLE hSemaphore,
    __in      LONG lReleaseCount,
    __out_opt LPLONG lpPreviousCount
    );
 
hSemaphore是要增加的信号量句柄。
lReleaseCount是增加的计数。
lpPreviousCount是增加前的数值返回。
 
调用函数的例子如下:
#001 //线程运行函数。
#002 //在这里可以使用类里的成员,也可以让派生类实现更强大的功能。
#003 //蔡军生 2007/10/10 QQ:9073204 深圳
#004 DWORD CThreadSemaphore::Run(void)
#005 {
#006  //输出到调试窗口。
#007  ::OutputDebugString(_T("Run()线程函数运行/r/n"));     
#008
#009  //
#010  const LONG cMax = 10;
#011   m_hSemaphore = CreateSemaphore(
#012        NULL,   // 缺省的安全属性。
#013        0,   // 初始化为0个信号量。
#014        cMax,   // 最大为10个信号量。
#015        NULL); // 不命名。
#016
#017  if (m_hSemaphore == NULL)
#018  {
#019         return -1;
#020  }
#021
#022  //
#023  const int nMaxObjs = 2;
#024  HANDLE hWaitObjects[nMaxObjs] = {m_hEventExit,m_hSemaphore};
#025
#026  //线程循环。
#027  for (;;)
#028  {
#029         DWORD dwRet = WaitForMultipleObjects(nMaxObjs,hWaitObjects,FALSE,INFINITE);
#030         if (dwRet == WAIT_TIMEOUT)
#031         {
#032               //可以继续运行。                
#033               TCHAR chTemp[128];
#034               wsprintf(chTemp,_T("CThreadSemaphore::Run() ThreadID=%d/r/n"),m_dwThreadID);
#035               ::OutputDebugString(chTemp);
#036
#037               //目前没有做什么事情,就让线程释放一下CPU。
#038               Sleep(10);
#039         }
#040         else if (dwRet == WAIT_OBJECT_0)
#041         {
#042               //退出线程。
#043               ::OutputDebugString(_T("Run() 退出线程/r/n"));
#044               break;
#045         }
#046         else if (dwRet == WAIT_OBJECT_0+1)
#047         {
#048               //可以继续运行。                
#049               TCHAR chTemp[128];
#050               wsprintf(chTemp,_T("CThreadSemaphore::Run() Semaphore,ThreadID=%d/r/n"),m_dwThreadID);
#051               ::OutputDebugString(chTemp);
#052
#053               //
#054
#055         }
#056         else if (dwRet == WAIT_ABANDONED)
#057         {
#058               //出错。
#059               ::OutputDebugString(_T("Run() 线程出错/r/n"));
#060               return -1;
#061         }
#062  }
#063
#064  //
#065  if (m_hSemaphore)
#066  {
#067         CloseHandle(m_hSemaphore);
#068          m_hSemaphore = NULL;
#069  }
#070
#071  return 0;
#072 }
#073
第11行就是创建信号量。
第29行等信号量事件和退出事件。
 
 
#001
#002  //
#003  //增加信号量
#004  //蔡军生 2007/10/10 QQ:9073204 深圳
#005  //
#006  void IncSemaphore(void)
#007  {
#008         if (m_hSemaphore)
#009         {
#010              if (!ReleaseSemaphore(
#011                    m_hSemaphore, // 要增加的信号量。
#012                   1,           // 增加1.
#013                   NULL) )      // 不想返回前一次信号量。
#014               {
#015
#016               }
#017         }
#018  }
#019

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/caimouse/archive/2007/10/10/1819116.aspx

转:信号量semphore相关推荐

  1. alios thing 信号量_信号量_AliOS Things内核_API参考文档_AliOS Things 文档_IoT物联网操作系统 - 阿里云...

    对于多任务,甚至多核的操作系统,需要访问共同的系统资源.共享资源包括软件资源和硬件资源,软件共享资源主要是共享内存,包括共享变量.共享队列等等,硬件共享资源包括一些硬件设备的访问,例如:输入/输出设备 ...

  2. 清华向勇《操作系统》学习笔记10:信号量与管程

    文章目录 10.1 信号量概念 10.2 信号量的使用 10.3 管程 10.4 经典同步问题 10.5 练习题 10.1 信号量概念 信号量(Semaphore)是另一种临界区的保护机制,它是操作系 ...

  3. NIO详解(七):进程间通信(MappedByteBuffer)

    1. 前言 最近在研究Java进程间通信,为了了解Java中的SharedMemory共享内存.我特地去研究了一些Java NIO进程间通信的方式. 2. Java NIO MappedByteBuf ...

  4. 96秒100亿!如何抗住双11高并发流量?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"加入公众号专属技术群 来源:uee.me/c9UsN 今年双 11 全民购物狂欢 ...

  5. 第一百一十二期:96秒100亿!如何抗住双11高并发流量?

    今年双 11 全民购物狂欢节进入第十一个年头,1 分 36 秒,交易额冲到 100 亿 !比 2018 年快了近 30 秒,比 2017 年快了近 1 分半!这个速度再次刷新天猫双 11 成交总额破 ...

  6. Java高级面试题解析(二):百度Java面试题前200页(精选)

    基本概念 操作系统中 heap 和 stack 的区别 heap是堆,stack是栈,是两种不同的数据结构.堆是队列优先,先进先出:栈是先进后出. 在java多线程中,每个线程都有自己的栈:不同的线程 ...

  7. 使用Guava的RateLimiter做限流

    一.问题描述   某天A君突然发现自己的接口请求量突然涨到之前的10倍,没多久该接口几乎不可使用,并引发连锁反应导致整个系统崩溃.如何应对这种情况呢?生活给了我们答案:比如老式电闸都安装了保险丝,一旦 ...

  8. Guava学习笔记(转)

    Guava(瓜娃)学习笔记 Guava工程包含了若干被google的java项目广泛依赖的核心库,例如:集合 [collections] .缓存 [caching] .原生类型支持 [primitiv ...

  9. Java与C语言中的锁

    Java与C语言中的锁 C 嵌入式汇编的语法格式是: asm(code : output operand list : input operand list : clobber list) __asm ...

最新文章

  1. flutter图标按钮_Flutter开发第一个项目android studio 开发工具的使用说明
  2. rapidminer员工离职分析_HR如何做好离职分析?
  3. 关于共享单车的供电问题如何解决?
  4. 在微信小程序中调用本地接口
  5. 小教活动总结-VB即时通讯小程序
  6. 1075 PAT Judge (25 分)【难度: 一般 / 知识点: 多关键字排序】
  7. Day11多态部分-4
  8. faster rcnn学习之rpn训练全过程
  9. react中引入html文件,在react中怎么引用js
  10. springCloud - 第6篇 - 网关的实现:ZUUL
  11. java不要无限循环_java – 看似无限循环终止,除非使用System.out.println
  12. liunx php的项目地址,在 Linux 配置 PHP 项目
  13. 莞工计算机学院杀手,莞工oj第40题神奇的fans
  14. C语言三款游戏(贪吃蛇、推箱子、小鸟飞飞)(含gui)(含完整代码、粘贴即用)
  15. usb网卡android驱动+win7,usb网卡万能驱动_手把手教你usb网卡驱动
  16. linux系统软路由软件,使用Linux+Zebra构建软路由系统
  17. 如何解决Mac电脑中的“AppStore无法下载软件”问题?
  18. iOS创建framework静态库(SDK组件化)
  19. 用Javascript开发《三国志曹操传》-开源讲座(一)-让静态人物动起来
  20. 让那不如意,都随风而去

热门文章

  1. 机器学习笔记(10)——逻辑回归算法优化之随机梯度下降法
  2. 【C语言】编程实现输出矩阵上/下三角的数值。要求:输入一个正整数n和n阶矩阵的数值,打印输出矩阵、下三角和上三角的数值。
  3. odoo中的inherit模型属性继承及模型关系
  4. 今日金融词汇---预收,是什么?
  5. 圣劳伦斯散热器举行北交所IPO上市辅导签约仪式
  6. (附源码)计算机毕业设计SSM羽毛球场地管理系统
  7. java/php/net/pythont羽毛球场地管理系统设计
  8. 川崎机器人总线通信_川崎机器人Profinet从站设定
  9. C语言far远程指针,C语言近程型(near)和远程型(far)的区别是什么?
  10. 张勋说:关于棒磨机的历史 你了解多少?(图文)