windows核心编程-信号量(semaphore)
线程同步的方式主要有:临界区、互斥区、事件、信号量四种方式。
前边讲过了互斥器线程同步-----windows核心编程-互斥器(Mutexes),这章我来介绍一下信号量(semaphore)线程同步。
理论上说,mutex是semaphore的一种退化。如果你产生一个semaphore并令最大值为1,那就是一个mutex。也因此,mutex又常被称为binary semaphore。如果某个线程拥有一个binary semaphore,那么就没有其他线程能够获得其拥有权。但是在win32中,这两种东西的拥有权的意义完全不同,所以它们不能够交换使用,semaphore不像mutex,它并没有所谓的“wait abandoned”状态可以被其他线程侦测到。
每当一个锁定动作成功,semaphore的现值就会减1,你可以使用任何一种wait...()函数来要求锁定一个semaphore。如果semaphore的现值不为0,wait...()函数会立刻返回,这和mutex很像,当没有任何线程拥有mutex,wait...()函数会立刻返回。
注意,如果锁定成功,你也不会收到semaphore的拥有权。因为可以有一个以上的线程同时锁定一个semaphore。所以谈semaphore的拥有权并没有太多实际意义。在semaphore身上并没有所谓“独占锁定”这种事情。也因为没有所有权的观念,一个线程可以反复调用wait...()函数以产生新的锁定。这和mutex绝不相同:拥有mutex的线程不论再调用多少次wait...()函数,也不会被阻塞住。
与mutex不同的是,调用ReleaseSemaphore()的那个线程,并不一定就得是调用wait...()的那个线程。
任何线程都可以在任何时间调用ReleaseSemaphore(),解除被任何线程锁定的semaphore。
以下是我对三种同步方式中,常用到的函数的总结。
| 临界区 | 互斥器 | 信号量 |
| CRITICAL_SECTION InitializeCriticalSection() |
CreateMutex() OpenMutex() |
CreateSemaphore |
| EnterCriticalSection() | WaitForSingleObject() WaitForMultipleObjects() MsgWaitForMultipleObjects() |
WaitForSingleObject() WaitForMultipleObjects() MsgWaitForMultipleObjects() ... |
| LeaveCriticalSection() | ReleaseMutex() | ReleaseSemaphore() |
| DeleteCriticalSection() | CloseHandle() | CloseHandle() |
事件线程同步----- window核心编程-内核对象线程同步
windows核心编程-信号量(semaphore)的更多相关文章
- 《Windows核心编程》读书笔记 上
[C++]<Windows核心编程>读书笔记 这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对 ...
- C++Windows核心编程读书笔记
转自:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%96%87/71405.shtml "C++Windows核心编程读书笔 ...
- 【转】《windows核心编程》读书笔记
这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入 ...
- windows核心编程 - 线程同步机制
线程同步机制 常用的线程同步机制有很多种,主要分为用户模式和内核对象两类:其中 用户模式包括:原子操作.关键代码段 内核对象包括:时间内核对象(Event).等待定时器内核对象(WaitableTim ...
- windows核心编程---第八章 使用内核对象进行线程同步
使用内核对象进行线程同步. 前面我们介绍了用户模式下线程同步的几种方式.在用户模式下进行线程同步的最大好处就是速度非常快.因此当需要使用线程同步时用户模式下的线程同步是首选. 但是用户模式下的线程同步 ...
- Windows核心编程学习九:利用内核对象进行线程同步
注:源码为学习<Windows核心编程>的一些尝试,非原创.若能有助于一二访客,幸甚. 1.程序框架 #include "Queue.h" #include <t ...
- windows核心编程-互斥器(Mutexes)
线程同步的方式主要有:临界区.互斥区.事件.信号量四种方式. 前边讲过了临界区线程同步-----windows核心编程-关键段(临界区)线程同步,这章我来介绍一下互斥器(Mutexes)在线程同步中的 ...
- windows核心编程 DLL技术 【转】
注:本文章转载于网络,源地址为:http://blog.csdn.net/ithzhang/article/details/7051558 本篇文章将介绍DLL显式链接的过程和模块基地址重定位及模块绑 ...
- 《Windows核心编程系列》二十谈谈DLL高级技术
本篇文章将介绍DLL显式链接的过程和模块基地址重定位及模块绑定的技术. 第一种将DLL映射到进程地址空间的方式是直接在源代码中引用DLL中所包含的函数或是变量,DLL在程序运行后由加载程序隐式的载入, ...
随机推荐
- Oracle除替换去掉换行符的方法
特殊符号ascii定义 : 换行符和回车符都要干掉. 制表符 chr(9) 换行符 chr(10) 回车符 chr(13) select replace(replace(列名,CHR(10),''), ...
- Matrix(线段树版)
poj2155:http://poj.org/problem?id=2155 题意;同上一遍随笔. 题解:这里用二维线段树打了一发.第一次学习别人的代码.才学的.这种树套树的程序,确实很费脑子,一不小 ...
- Xamarin for OSX – SetUp
正常情况联网会失败 按照安装顺序进行安装(mono framework->java sdk-> android sdk->xamarin studio->xamarin.and ...
- BZOJ1976: [BeiJing2010组队]能量魔方 Cube
1976: [BeiJing2010组队]能量魔方 Cube Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 832 Solved: 281[Submi ...
- cf591A Wizards' Duel
A. Wizards' Duel time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- 使用GDB生成coredump文件【转载】
本文转载自: http://blog.csdn.net/sky_qing/article/details/8548989 如果在测试过程中遇到某个进程的CPU利用率过高或者卡死而需要去调试该进程时,可 ...
- 黑马程序员_<<properties,打印流,合并流,分割流>>
--------------------ASP.Net+Android+IOS开发..Net培训.期待与您交流! -------------------- 1. Properties 1.概述 Pro ...
- motan源码分析五:cluster相关
上一章我们分析了客户端调用服务端相关的源码,但是到了cluster里面的部分我们就没有分析了,本章将深入分析cluster和它的相关支持类. 1.clustersupport的创建过程,上一章的Ref ...
- motan源码分析二:使用spi机制进行类加载
在motan的源码中使用了很多的spi机制进行对象的创建,下面我们来具体分析一下它的实现方法. 1.在实际的jar包的\META-INF\services目录中引入相关的文件,例如下图中,我解压了co ...
- 我与Ubuntu的5年共成长
初次接触Ubuntu那还是2010年的初夏,那年大学二年级即将结束,为了增加计算机学院学生的技术能力和就业竞争力,学校组织了很多培训机构.公司企业来学校做技术宣讲.分享等 记得有一个企业是做Mp3 M ...