win32多线程程序设计笔记(第四章下)
来源:互联网 发布:ipadpro10.5必备软件 编辑:程序博客网 时间:2024/06/05 19:47
上一笔记讲了同步机制中的临界区域(Critical Sections)、互斥器(Mutexes),下面介绍同步机制中的另外两种。
信号量(Semaphores)
举个例子:
现在有人要租车,接待他的代理人发现还有3辆车可以用,但正在给他办理手续的时候发现还有三个人也在做同样的动作。现在,就是有四个人想租三辆车。
我们写个程序解决租车问题,方法一就是为每辆车都加一个mutex保护,问题是如果是一家大型出租车公司就需要有成百上千的mutexes了。方法二使用单一的mutex为所有的车辆服务,但一次只能有一个店员出租,这样问题就是客户会减少。
解决:
现在我们将所有的车视为相同,车交到客户手上之前,唯一需要知道的就是现在有几辆车可以用,我们用semaphore来维护这个数字,每一个锁定动作成功,semaphore的现值就会减1。
注意:与mutex不同的是,调用ReleaseSemaphore()的那个线程,并不一定就得是调用wait...()的那个线程。任何线程都可以在任何时间调用ReleaseSemaphore(),解除被任何线程锁定的semaphore。
事件(Event)
//复习
从第三章以来,每章都讲到了一个重要的函数,就是Wait...()系列函数。
第三章判断一个线程是否结束:WaitForSingleObject(HANDLE hthred,...);
第四章中判断是否能够进入锁住互斥器:WatiForSingleObject(hMutex,...);
Wait...()函数会在核心对象被激发时返回。对于hthred而言,线程结束,意味着核心对象被激发;对于hMutex而言, hMutex不再被其它任何线程使用,意味着核心对象被激发。反正对于各种核心对象而言,一定是有某种场景的出现使得核心对象被激发,除了Event这个核心对象。
===============================================
对于Event这个核心对象而言,它的激发状态完全由程序来控制,也就是说,由自己来控制Event的激发或未激发状态( 通过SetEvent() , ResetEvent() )。当线程1因调用Wait…(hEvent)而被阻塞后,一定是某个线程调用了SetEvent( hEvent )使hEvent被设为激发状态,从而使线程1被解除阻塞继续向下运行,具体的运用参见下表:
(使用CreateEvent ()函数构造Event核心对象,CreateEvent ()的第二个参数决定了产生的Event对象是Manual(手工)方式还是Auto(自动)方式;第三个参数决定了决定了产生的Event对象初始状态是激发还是未激发)
- win32多线程程序设计笔记(第四章下)
- WIN32多线程程序设计学习笔记(第四章 下 第五章)
- WIN32多线程程序设计学习笔记(第四章 下 第五章)
- WIN32多线程程序设计学习笔记(第四章 下 第五章)
- WIN32多线程程序设计学习笔记(第四章 上)
- WIN32多线程程序设计学习笔记(第四章 上)
- WIN32多线程程序设计学习笔记(第四章 上)
- win32多线程程序设计笔记(第四章上)
- WIN32多线程程序设计学习笔记(第六章 下)
- WIN32多线程程序设计学习笔记(第六章 下)
- WIN32多线程程序设计学习笔记(第六章 下)
- WIN32多线程程序设计学习笔记(第六章 下)
- WIN32多线程程序设计学习笔记(第六章 下)
- win32多线程程序设计笔记(第六章下)
- win32多线程程序设计笔记(第二章)
- win32多线程程序设计笔记(第三章)
- win32多线程程序设计笔记(第五章)
- WIN32多线程程序设计学习笔记(第二章)
- ABAP中SELECTION-SCREEN用法
- nginx 连接数
- vmware 安装ubuntu
- 2.18 数组分割
- win7下android开发环境搭建(win7 64位)
- win32多线程程序设计笔记(第四章下)
- 设置ListCtrl的风格
- c++指针比较的含义
- 项目管理TFS之路
- Ajax实现多级联动菜单
- 方向与计划
- CUDA 我的驱动
- PagerTabStrip和PagerTitleStrip异同
- 端口复用的WXHSHELL源代码