信号量CSemaphore的使用
信号量是CSemaphore的对象,该对象的作用是对访问某个共享资源的线程的数目进行控制。
CSemaphore类的构造函数原型如下:
LONG lInitialCount /* = 1 */, //计数器的初始值
LONG lMaxCount /* = 1 */, //计数器的最大计数值
LPCTSTR pstrName/* =NULL */, //信号的名称
LPSECURITY_ATTRIBUTES lpsaAttributes /* = NULL */ //指向一个SECURITY_ATTRIBUTES结构的指针
)
信号量对象中有一个可以设置初值的计数器,每当一个线程使用资源时,在该线程中就调用信号计数器对象的成员函数Lock()将该计数器的值减一,当计数器为0时,就不再允许其他线程访问该资源;而当一个线程使用信号量对象的成员函数Unlock()释放资源时,可以将计数器的值加一。因此,信号量对象允许多个线程访问同一个资源,但同时访问该资源的线程总数不能超过信号量对象的最大计数值。
示例:编写一个有四个线程的应用程序,理解信号量对象的使用。
1.创建单文档应用程序;
2.在视图类的实现文件定义一个信号量对象:
3.在视图类的实现文件中定义四个线程函数:
{
semaphoreObj.Lock();
LPTSTR pMessage = _T("Thread1 is started");
CWnd *pMainWnd = AfxGetMainWnd();
::MessageBox(pMainWnd->m_hWnd, pMessage, _T("Thread messaeg"), MB_OK);
semaphoreObj.Unlock();
return 0;
}
UINT MessageThread2(LPVOID pParam)
{
semaphoreObj.Lock();
LPTSTR pMessage = _T("Thread2 is started");
CWnd *pMainWnd = AfxGetMainWnd();
::MessageBox(pMainWnd->m_hWnd, pMessage, _T("Thread messaeg"), MB_OK);
semaphoreObj.Unlock();
return 0;
}
UINT MessageThread3(LPVOID pParam)
{
semaphoreObj.Lock();
LPTSTR pMessage = _T("Thread3 is started");
CWnd *pMainWnd = AfxGetMainWnd();
::MessageBox(pMainWnd->m_hWnd, pMessage, _T("Thread messaeg"), MB_OK);
semaphoreObj.Unlock();
return 0;
}
UINT MessageThread4(LPVOID pParam)
{
semaphoreObj.Lock();
LPTSTR pMessage = _T("Thread4 is started");
CWnd *pMainWnd = AfxGetMainWnd();
::MessageBox(pMainWnd->m_hWnd, pMessage, _T("Thread messaeg"), MB_OK);
semaphoreObj.Unlock();
return 0;
}
4.在视图类的鼠标左键消息函数里面添加如下:
{
AfxBeginThread(MessageThread1, _T("Thread is started"));
AfxBeginThread(MessageThread2, _T("Thread is started"));
AfxBeginThread(MessageThread3, _T("Thread is started"));
AfxBeginThread(MessageThread4, _T("Thread is started"));
CView::OnLButtonDown(nFlags, point);
}
程序运行结果如下:
参考资料:
1.信号量(CSemaphore)——MFC http://blog.sina.com.cn/s/blog_627ebfc30100iv4w.html
2.《MFC Windows应用程序设计(第2版)》
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow
信号量CSemaphore的使用相关推荐
- MFC多线程 信号量CSemaphore 临界区与互斥 事件
CMutex, CCriticalSection用于对资源的互斥访问. CMutex可以跨进程使用, CCriticalSection只可以在进程内部使用. 创建CMutex需要更多的资源,只用于进程 ...
- (转)CEvent,CSemaphore,CCriticalSection,CMutex
一.用CEvent实现线程同步 事件对象(Event)是最简单的同步对象,它包括有信号和无信号两种状态.在线程访问某一资源之前,也许需要等待某一事件的发生,这时用事件对象最合适.例如,只有在通信端口缓 ...
- CMutex、CCriticalSection、CSemaphore、CEvent、WaitForSingleObject 的小例子
一.CMutex CMutex mutex; mutex.Lock(); // 互斥的动作 // mutex.Unlock(); 二.CCriticalSection CCriticalSection ...
- CEvent,CSemaphore,CCriticalSection,CMutex
一.用CEvent实现线程同步 事件对象(Event)是最简单的同步对象,它包括有信号和无信号两种状态.在线程访问某一资源之前,也许需要等待某一事件的发生,这时用事件对象最合适.例如,只有在通信端口缓 ...
- 服务注册发现consul之四: 分布式锁之四:基于Consul的KV存储和分布式信号量实现分布式锁...
一.基于key/value实现 我们在构建分布式系统的时候,经常需要控制对共享资源的互斥访问.这个时候我们就涉及到分布式锁(也称为全局锁)的实现,基于目前的各种工具,我们已经有了大量的实现方式,比如: ...
- 信号量,互斥锁,条件变量的联系与区别
转自:http://blog.chinaunix.net/u3/108685/showart_2127853.html 信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程, ...
- Linux多线程的同步-----信号量和互斥锁
前面两篇给基本概念讲过了,大家有兴趣的可以去看一下: Linux多线程_神厨小福贵!的博客-CSDN博客进程和线程的区别有哪些呢?进程是资源分配的最小单位,线程是CPU调度的最小单位进程有自己的独立地 ...
- Linux编程题:信号量同步三进程依次打印若干次ABC
三个进程依次打印ABC..... 思路及大致流程如下: 思路取自这位大哥: Linux编程题:创建3个线程分别打印abc,用信号量进行同步_cleverlemon的博客-CSDN博客 这位大哥写的是线 ...
- linux进程间通信:POSIX信号量
文章目录 概念描述 编程接口 注意事项 编程案例 信号量基本接口使用案例 信号量父子进程间通信 信号量实现 两进程之间通信 概念描述 英文:semaphore 简称SEM,主要用来进行进程间同步 本质 ...
最新文章
- Redis 哈希结构内存模型剖析
- 连载:阿里巴巴大数据实践—数据服务
- php 修改密码提示,修改密码通知
- android缩放动画的两种实现方法
- C语言中使输入的字符串反序输出,C语言: 写一函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。...
- linux 关闭 vim配色方案,10 个你值得拥有的 Vim 配色方案
- vmware funsion 共享网络模式下PPTP拨号问题
- 可以出题的答题小程序
- UML建模与软件开发设计(三)——UML常用开发工具
- C、C++编程学习资料收藏
- navicat编程界面_主界面初识 Navicat Premium使用技巧(一)
- 【数据应用案例】金融行业大数据用户画像实践
- 网站使用手机相机_谷歌相机安装教程,让你的手机拥有强大的夜拍能力
- 2013年08月威海之旅
- c#操作excel 使用excel自带类库Microsoft.Office.Interop.Excel
- 可以储存照片的字段类型是_如果将学生的“照片”存储在表中,则数据应采用的字段类型为...
- Android studio Build时,Download maven-metadata.xml卡住不动的问题
- python程序员能做什么副业好_程序员可以做哪些副业?
- Jmeter下载保存文件,使用请求中中文文件名称
- 假设银行定期存款年利率rate为2.25%,已知存款本金capital元,尝试编程计算n年后可得到的本利之和deposit为多少?
热门文章
- excel如何快速选中某个区域
- java 课后习题 奇数排前
- 【Java】用while循环实现1+2+3......+100
- 【Python爬虫】Request库入门
- Upload-Labs(16)
- C#LeetCode刷题之#111-二叉树的最小深度​​​​​​​(Minimum Depth of Binary Tree)
- 这个世界上不止有Mysql,还有很多ClickHouse们
- golang go语言_在Go语言中无需反思即可使用Lodash的好处
- java bean转string_Json、JavaBean、String等互转
- origin对独立曲线进行操作