在开发软件的过程中,多线程的程序往往需要实现相互通讯,比如几个线程添加一个消息到队列里,而另一个线程在睡眠时,就需要唤醒那个线程来处理事情。在这其中,就需要使用到信号量来进行同步。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 //
#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 //
#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
CreateSemaphore和ReleaseSemaphore函数相关推荐
- Windows API一日一练(47)CreateSemaphore和ReleaseSemaphore函数
在开发软件的过程中,多线程的程序往往需要实现相互通讯,比如几个线程添加一个消息到队列里,而另一个线程在睡眠时,就需要唤醒那个线程来处理事情.在这其中,就需要使用到信号量来进行同步.CreateSema ...
- Windows API一日一练 47 CreateSemaphore和ReleaseSemaphore函数
在开发软件的过程中,多线程的程序往往需要实现相互通讯,比如几个线程添加一个消息到队列里,而另一个线程在睡眠时,就需要唤醒那个线程来处理事情.在这其中,就需要使用到信号量来进行同步.CreateSema ...
- Windows API -- CreateSemaphore和ReleaseSemaphore函数
该博客旨在分享IT技术心得和实际工作中遇到问题的解决方法,以下是新浪博客地址http://blog.sina.com.cn/qianyumolu,则为分享经济.行业趋势.心灵文章等,有兴趣的朋友可以踩 ...
- CreateSemaphore和ReleaseSemaphore函数(转)
在开发软件的过程中,多线程的程序往往需要实现相互通讯,比如几个线程添加一个消息到队列里,而另一个线程在睡眠时,就需要唤醒那个线程来处理事情.在这其中,就需要使用到信号量来进行同步.CreateSema ...
- 函数CreateSemaphore和ReleaseSemaphore
函数CreateSemaphore和ReleaseSemaphore声明如下: WINBASEAPI __out HANDLE WINAPI CreateSemaphoreA( __in_op ...
- CreateEvent、CreateSemaphore、ReleaseSemaphore、CreateMutex
/// 用户模式 对事件进行初始化操作 HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性BOOL bManualR ...
- CreateSemaphore与ReleaseSemaphore
在开发软件的过程中,多线程的程序往往需要实现相互通讯,比如几个线程添加一个消息到队列里,而另一个线程在睡眠时,就需要唤醒那个线程来处理事情.在这其中,就需要使用到信号量来进行同步.CreateSema ...
- 十六:CreateSemaphore创建信号量,ReleaseSemaphore增加信号量 函数
在开发软件的过程中,多线程的程序往往需要实现相互通讯,比如几个线程添加一个消息到队列里,而另一个线程在睡眠时,就需要唤醒那个线程来处理事情.在这其中,就需要使用到信号量来进行同步.CreateSema ...
- CreateSemaphore、OpenSemaphore、ReleaseSemaphore
CreateSemaphore函数的功能是创建信号量对象,函数原型如下: HANDLE WINAPI CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphor ...
最新文章
- 买个服务器来挂协议,云服务器代挂协议在哪
- boost::sort模块实现相关字符串插入测试
- 北京化工大学计算机科专业,北京化工大学专业介绍及排名 哪些专业最好
- Salesforce 超越 Oracle:四十年的甲骨文和二十岁的SaaS之王
- 使用Zuul构建API Gateway
- 非常详细的 Docker 学习笔记
- Dos命令将合并两个文本文件的内容
- docker端口映射失效解决方法
- [Java并发编程(三)] Java volatile 关键字介绍
- 占空比50%的5分频 记事续 20110920
- 如何在 Apache Flink 1.10 中使用 Python UDF?
- moment.js获取一周的第一天
- UE4线程池源码分析和线程池的封装
- hbase 报:Java::JavautilConcurrent::TimeoutException:The procedure 1 is still running
- pnpm : 无法加载文件 C:\Users\86183\AppData\Roaming\npm\pnpm.ps1,因为在此系统上禁止运行脚本。
- python mac可以运行win不能运行_Pymssql程序可以在mac上运行,但不能在windows上运行...
- 实现QQ登陆(QQ互联)
- 【知识图谱】深入浅出讲解知识图谱(技术、构建、应用)
- Windows外接显示器无信号解决方案
- openvz的安装与使用
热门文章
- Google搜索为什么不能无限分页?
- 百度专网地图,助力中国联通智慧运营
- 域名解析记录类型的作用与区别
- pyrosim2016 Windows10安装教程 以及无法打开的解决办法
- Python【2021年蓝桥杯省赛填空】
- mysql 遍历XML_mybatis 中,mapper.xml中遍历list集合知识点
- 数组与字符串长度 — C语言经典方法
- SpringBoot直通车
- 计算机知识大讲堂,计算机知识讲座策划书
- QA:xilinx系列verilog版出版事宜