转:信号量semphore
转自:蔡军生博文
在开发软件的过程中,多线程的程序往往需要实现相互通讯,比如几个线程添加一个消息到队列里,而另一个线程在睡眠时,就需要唤醒那个线程来处理事情。在这其中,就需要使用到信号量来进行同步。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相关推荐
- alios thing 信号量_信号量_AliOS Things内核_API参考文档_AliOS Things 文档_IoT物联网操作系统 - 阿里云...
对于多任务,甚至多核的操作系统,需要访问共同的系统资源.共享资源包括软件资源和硬件资源,软件共享资源主要是共享内存,包括共享变量.共享队列等等,硬件共享资源包括一些硬件设备的访问,例如:输入/输出设备 ...
- 清华向勇《操作系统》学习笔记10:信号量与管程
文章目录 10.1 信号量概念 10.2 信号量的使用 10.3 管程 10.4 经典同步问题 10.5 练习题 10.1 信号量概念 信号量(Semaphore)是另一种临界区的保护机制,它是操作系 ...
- NIO详解(七):进程间通信(MappedByteBuffer)
1. 前言 最近在研究Java进程间通信,为了了解Java中的SharedMemory共享内存.我特地去研究了一些Java NIO进程间通信的方式. 2. Java NIO MappedByteBuf ...
- 96秒100亿!如何抗住双11高并发流量?
点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"加入公众号专属技术群 来源:uee.me/c9UsN 今年双 11 全民购物狂欢 ...
- 第一百一十二期:96秒100亿!如何抗住双11高并发流量?
今年双 11 全民购物狂欢节进入第十一个年头,1 分 36 秒,交易额冲到 100 亿 !比 2018 年快了近 30 秒,比 2017 年快了近 1 分半!这个速度再次刷新天猫双 11 成交总额破 ...
- Java高级面试题解析(二):百度Java面试题前200页(精选)
基本概念 操作系统中 heap 和 stack 的区别 heap是堆,stack是栈,是两种不同的数据结构.堆是队列优先,先进先出:栈是先进后出. 在java多线程中,每个线程都有自己的栈:不同的线程 ...
- 使用Guava的RateLimiter做限流
一.问题描述 某天A君突然发现自己的接口请求量突然涨到之前的10倍,没多久该接口几乎不可使用,并引发连锁反应导致整个系统崩溃.如何应对这种情况呢?生活给了我们答案:比如老式电闸都安装了保险丝,一旦 ...
- Guava学习笔记(转)
Guava(瓜娃)学习笔记 Guava工程包含了若干被google的java项目广泛依赖的核心库,例如:集合 [collections] .缓存 [caching] .原生类型支持 [primitiv ...
- Java与C语言中的锁
Java与C语言中的锁 C 嵌入式汇编的语法格式是: asm(code : output operand list : input operand list : clobber list) __asm ...
最新文章
- flutter图标按钮_Flutter开发第一个项目android studio 开发工具的使用说明
- rapidminer员工离职分析_HR如何做好离职分析?
- 关于共享单车的供电问题如何解决?
- 在微信小程序中调用本地接口
- 小教活动总结-VB即时通讯小程序
- 1075 PAT Judge (25 分)【难度: 一般 / 知识点: 多关键字排序】
- Day11多态部分-4
- faster rcnn学习之rpn训练全过程
- react中引入html文件,在react中怎么引用js
- springCloud - 第6篇 - 网关的实现:ZUUL
- java不要无限循环_java – 看似无限循环终止,除非使用System.out.println
- liunx php的项目地址,在 Linux 配置 PHP 项目
- 莞工计算机学院杀手,莞工oj第40题神奇的fans
- C语言三款游戏(贪吃蛇、推箱子、小鸟飞飞)(含gui)(含完整代码、粘贴即用)
- usb网卡android驱动+win7,usb网卡万能驱动_手把手教你usb网卡驱动
- linux系统软路由软件,使用Linux+Zebra构建软路由系统
- 如何解决Mac电脑中的“AppStore无法下载软件”问题?
- iOS创建framework静态库(SDK组件化)
- 用Javascript开发《三国志曹操传》-开源讲座(一)-让静态人物动起来
- 让那不如意,都随风而去
热门文章
- 机器学习笔记(10)——逻辑回归算法优化之随机梯度下降法
- 【C语言】编程实现输出矩阵上/下三角的数值。要求:输入一个正整数n和n阶矩阵的数值,打印输出矩阵、下三角和上三角的数值。
- odoo中的inherit模型属性继承及模型关系
- 今日金融词汇---预收,是什么?
- 圣劳伦斯散热器举行北交所IPO上市辅导签约仪式
- (附源码)计算机毕业设计SSM羽毛球场地管理系统
- java/php/net/pythont羽毛球场地管理系统设计
- 川崎机器人总线通信_川崎机器人Profinet从站设定
- C语言far远程指针,C语言近程型(near)和远程型(far)的区别是什么?
- 张勋说:关于棒磨机的历史 你了解多少?(图文)