信号量是CSemaphore的对象,该对象的作用是对访问某个共享资源的线程的数目进行控制。

CSemaphore类的构造函数原型如下:

CSemaphore( 
    LONG lInitialCount /* = 1 */,    //计数器的初始值 
    LONG lMaxCount /* = 1 */,        //计数器的最大计数值 
    LPCTSTR pstrName/* =NULL */,        //信号的名称 
    LPSECURITY_ATTRIBUTES lpsaAttributes /* = NULL */    //指向一个SECURITY_ATTRIBUTES结构的指针 

信号量对象中有一个可以设置初值的计数器,每当一个线程使用资源时,在该线程中就调用信号计数器对象的成员函数Lock()将该计数器的值减一,当计数器为0时,就不再允许其他线程访问该资源;而当一个线程使用信号量对象的成员函数Unlock()释放资源时,可以将计数器的值加一。因此,信号量对象允许多个线程访问同一个资源,但同时访问该资源的线程总数不能超过信号量对象的最大计数值。

示例:编写一个有四个线程的应用程序,理解信号量对象的使用。
1.创建单文档应用程序;
2.在视图类的实现文件定义一个信号量对象:

CSemaphore semaphoreObj(2,3); 

3.在视图类的实现文件中定义四个线程函数:

UINT MessageThread1(LPVOID pParam) 

    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.在视图类的鼠标左键消息函数里面添加如下:

void CThreadTestView::OnLButtonDown(UINT nFlags, CPoint point) 

    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的使用相关推荐

  1. MFC多线程 信号量CSemaphore 临界区与互斥 事件

    CMutex, CCriticalSection用于对资源的互斥访问. CMutex可以跨进程使用, CCriticalSection只可以在进程内部使用. 创建CMutex需要更多的资源,只用于进程 ...

  2. (转)CEvent,CSemaphore,CCriticalSection,CMutex

    一.用CEvent实现线程同步 事件对象(Event)是最简单的同步对象,它包括有信号和无信号两种状态.在线程访问某一资源之前,也许需要等待某一事件的发生,这时用事件对象最合适.例如,只有在通信端口缓 ...

  3. CMutex、CCriticalSection、CSemaphore、CEvent、WaitForSingleObject 的小例子

    一.CMutex CMutex mutex; mutex.Lock(); // 互斥的动作 // mutex.Unlock(); 二.CCriticalSection CCriticalSection ...

  4. CEvent,CSemaphore,CCriticalSection,CMutex

    一.用CEvent实现线程同步 事件对象(Event)是最简单的同步对象,它包括有信号和无信号两种状态.在线程访问某一资源之前,也许需要等待某一事件的发生,这时用事件对象最合适.例如,只有在通信端口缓 ...

  5. 服务注册发现consul之四: 分布式锁之四:基于Consul的KV存储和分布式信号量实现分布式锁...

    一.基于key/value实现 我们在构建分布式系统的时候,经常需要控制对共享资源的互斥访问.这个时候我们就涉及到分布式锁(也称为全局锁)的实现,基于目前的各种工具,我们已经有了大量的实现方式,比如: ...

  6. 信号量,互斥锁,条件变量的联系与区别

    转自:http://blog.chinaunix.net/u3/108685/showart_2127853.html 信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程, ...

  7. Linux多线程的同步-----信号量和互斥锁

    前面两篇给基本概念讲过了,大家有兴趣的可以去看一下: Linux多线程_神厨小福贵!的博客-CSDN博客进程和线程的区别有哪些呢?进程是资源分配的最小单位,线程是CPU调度的最小单位进程有自己的独立地 ...

  8. Linux编程题:信号量同步三进程依次打印若干次ABC

    三个进程依次打印ABC..... 思路及大致流程如下: 思路取自这位大哥: Linux编程题:创建3个线程分别打印abc,用信号量进行同步_cleverlemon的博客-CSDN博客 这位大哥写的是线 ...

  9. linux进程间通信:POSIX信号量

    文章目录 概念描述 编程接口 注意事项 编程案例 信号量基本接口使用案例 信号量父子进程间通信 信号量实现 两进程之间通信 概念描述 英文:semaphore 简称SEM,主要用来进行进程间同步 本质 ...

最新文章

  1. Redis 哈希结构内存模型剖析
  2. 连载:阿里巴巴大数据实践—数据服务
  3. php 修改密码提示,修改密码通知
  4. android缩放动画的两种实现方法
  5. C语言中使输入的字符串反序输出,C语言: 写一函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。...
  6. linux 关闭 vim配色方案,10 个你值得拥有的 Vim 配色方案
  7. vmware funsion 共享网络模式下PPTP拨号问题
  8. 可以出题的答题小程序
  9. UML建模与软件开发设计(三)——UML常用开发工具
  10. C、C++编程学习资料收藏
  11. navicat编程界面_主界面初识 Navicat Premium使用技巧(一)
  12. 【数据应用案例】金融行业大数据用户画像实践
  13. 网站使用手机相机_谷歌相机安装教程,让你的手机拥有强大的夜拍能力
  14. 2013年08月威海之旅
  15. c#操作excel 使用excel自带类库Microsoft.Office.Interop.Excel
  16. 可以储存照片的字段类型是_如果将学生的“照片”存储在表中,则数据应采用的字段类型为...
  17. Android studio Build时,Download maven-metadata.xml卡住不动的问题
  18. python程序员能做什么副业好_程序员可以做哪些副业?
  19. Jmeter下载保存文件,使用请求中中文文件名称
  20. 假设银行定期存款年利率rate为2.25%,已知存款本金capital元,尝试编程计算n年后可得到的本利之和deposit为多少?

热门文章

  1. excel如何快速选中某个区域
  2. java 课后习题 奇数排前
  3. 【Java】用while循环实现1+2+3......+100
  4. 【Python爬虫】Request库入门
  5. Upload-Labs(16)
  6. C#LeetCode刷题之#111-二叉树的最小深度​​​​​​​(Minimum Depth of Binary Tree)
  7. 这个世界上不止有Mysql,还有很多ClickHouse们
  8. golang go语言_在Go语言中无需反思即可使用Lodash的好处
  9. java bean转string_Json、JavaBean、String等互转
  10. origin对独立曲线进行操作