Apple公司Darwin流式服务器源代码分析

合集下载

Pushlet源码分析(服务器端)

Pushlet源码分析(服务器端)

Pushlet 2.0.3 源码分析----服务器端1 总体架构Pushlet从功能上实现了服务器推技术,整个框架涉及了服务器端以及客户端的部署。

服务器端采用servlet技术,监听客户端请求。

客户端分为两大类,浏览器以及桌面应用程序。

下图描述了系统的整体框架:图1 pushlet总体架构图从图中可以看出服务器端返回响应的出口只有一个,那就是clientAdapter,它只是一个接口,根据不同的客户端类型来产生相应的adapter发送响应结果。

各个类的主要职责描述:Pushlet:负责接收所有用户请求,并将请求包装为event对象,在根据session、event、request、response对象构造一个command对象,最后将command对象交由controller处理。

Session:代表一次用户会话,此类不同于httpsession,因为此session的实现是使用类似url重写方式,在服务器分配了sessionid之后的每个请求中都加入这个参数以标识会话。

会话在其存活期内有效。

Controller:是所有命令的执行器,包括各种控制命令以及数据推送命令。

不过对于数据推送的实际执行并不是在controller中实现,而是委托给subscriber只执行。

Subscriber:这是核心类之一。

它维护了一个阻塞的事件队列,根据客户端使用的不同模式(框架定义的模式有:stream,pull/poll,stream使用了http长连接,pull/poll则是通过客户端定时刷新实现服务端推送)来发送响应事件。

Dispatcher:事件分发器,也是核心类之一。

事件来源可以是客户(通过publish命令发布事件),也可以是eventSource。

实现了多播,广播以及单播事件,具体采用哪种方式根据事件属性决定。

事件接收端即是subscriber的事件队列。

clientAdapter:有3个具体实现,browserAdapter、XMLAdapter、serializedAdapter。

某信服EDR源码分析

某信服EDR源码分析

某信服EDR源码分析基于EDR源码的⼀次分析变量覆盖漏洞常见的引发变量覆盖的漏洞函数有:extract(),parse_str(),import_request_variables(),$$。extract():extract()函数从数组中将变量导⼊到当前的符号表,该函数使⽤数组键名作为变量名,使⽤数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的⼀个变量。

语法:extract(array,extract_rules,prefix)

实例: 源码分析1 function ldb_input_field($info) {2 extract($info);3 $value = htmlentities($value);4 echo "$title: 5 6 $note";7 } Extract()函数的第⼆个参数为空,默认情况下会对$info变量进⾏覆盖RCE漏洞(1)

https://xxx.com:xxx/tool/log/c.php?strip_slashes=system&host=id

找到/tool/log/c.php,定位到代码 1 $show_form($_REQUEST);2 echo "

将$_REQUEST传递进$show_form匿名函数

1 $show_form = function($params) use(&$strip_slashes, &$show_input) { 2 extract($params); 3 $host = isset($host) ? $strip_slashes($host) : "127.0.0.1"; 4 $path = isset($path) ? $strip_slashes($path) : ""; 5 $row = isset($row) ? $strip_slashes($row) : ""; 6 $limit = isset($limit) ? $strip_slashes($limit) : 1000; 7 8 // 绘制表单 9 echo "

为什么说MacOSX不会被病入侵基于新型病流行检测

为什么说MacOSX不会被病入侵基于新型病流行检测

为什么说MacOSX不会被病入侵基于新型病流行检测基于新型病流行检测,为什么说MacOSX不会被病入侵?随着科技的不断发展和计算机操作系统的不断推陈出新,网络安全方面的问题也在不断增多,各种病毒、木马、蠕虫、Trojan等恶意程序的出现使得计算机用户对于网络安全问题越发关注。

在众多计算机操作系统中,MacOSX因其相对稳定的操作和较高的系统安全性而备受用户喜爱。

然而,相信很多人在使用MacOSX时或多或少会有一个疑问:为什么说MacOSX不会被病入侵?本文将基于新型病流行检测,对这个问题进行探究。

一、基于MacOSX的特点MacOSX的核心技术是Darwin,而Darwin是基于FreeBSD的开放源代码操作系统内核Mach和BSD的设计模式下构建的。

相比于其他的操作系统,如Windows,MacOSX具有以下一些特点:1. 少量病毒针对MacOSX的病毒相对较少,这与MacOSX的市场份额和操作系统内核的设计有关。

目前来看,大多数的计算机病毒都是基于Windows操作系统一系列漏洞或者软件设计的BUG攻击。

而MacOSX的市场份额较小,加上其系统本身具有的较强的安全性,因此相比而言MacOSX上的病毒数量就会比较少。

2. 内部安全管理MacOSX拥有内建的安全管理系统,其核心技术就是“Gatekeeper”和“SIP”。

其中,“Gatekeeper”是一种设防系统,会在应用程序打开前检测证书以及应用程序是否来自于可信的开发者,以此来确保用户运行的应用程序是安全可靠的。

而“SIP”(System Integrity Protection)是一种保护机制,它可以确保系统文件不被篡改,因此可以防止一些病毒或者木马类的恶意软件修改系统的相关文件,从而确保系统的安全性。

3. 隔离隔离容器技术另外一个重要的MacOSX特点就是隔离容器技术,这种技术可以将应用程序和系统的其他部分隔离开来。

如果一个应用程序被攻陷了,这种隔离容器技术就能够使得病毒无法向外传播。

unix代码解析

unix代码解析

下篇莱昂氏UNIX源代码分析本书是U N I X操作系统版本6源代码的姐妹篇。

它对U N I X操作系统的源代码进行了分析。

U N I X软件系统是由贝尔实验室的肯・汤姆森和丹尼斯・里奇编写的。

本文档包含了贝尔系统专有的信息。

仅限于贝尔系统中工作与此相关的授权雇员使用。

不允许向非授权雇员泄露本书的内容或为其作复制。

在贝尔系统之外,只限于向U N I X分时操作系统版本6许可证的持有者配售此书。

使用、复制本文档受到Western Electric公司发出的这种许可权上所指明的限制。

前言本书力图详细解释一个操作系统的内核,该操作系统在几年内将成为最重要的系统之一。

这个操作系统就是U N I X分时系统,它在数字设备公司的P D P11计算机系统的较大型机上运行,由贝尔实验室的肯・汤姆森和丹尼斯・里奇设计并实现。

《A C M通信》(Communication of ACM)1974年7月号上宣布其问世。

在对U N I X稍加研究后,我们就发现U N I X可作为学生们深入学习的正式课程,其理由是:• UNIX在我们已具有的系统上运行。

• 该系统非常紧凑,源代码和有关资料都可方便取用。

• 它提供非常广泛的可用功能。

• 它是一个非常优良的操作系统,事实上它开辟了许多操作系统的新领地。

在U N I X分时系统的魅力和优越性中的一个重要点是其源代码的紧凑性。

当只提供少量外部设备时,该系统常驻内存的内核源代码长度大约只有9 000行。

通常认为一个人能够理解和维护的程序长度约为1 0000代码行。

大多数操作系统或者其长度超过这种限制1~2个数量级,或者只向用户提供非常有限的功能,也就是说或者除极少数非常专注、能投入大量时间的学生外大多数学生都无法了解其详细情况,或者这种系统是专用的,在技术方面没有进行学习的实际价值。

教授操作系统课程大致有三种方法:第一种是“一般原理”法(general principle),这种方法详细阐述基本工作原理,并引用若干个现存操作系统作为示例,但一般学生对这些系统都缺少直接经验。

Darwin语言简介

Darwin语言简介

Darwin描述语言简介1、Darwin简介:Darwin最初是一个分布式系统配置语言,引入软件体系结构研究后,Darwin成为一个体系结构描述语言。

作为一个ADL,Darwin对软件系统的静态结构的描述和UniCon非常相似,不过Darwin中引入了一些特有的构造(construct)使之便于描述系统的动态特性。

Darwin采用π演算来分析、描述带有演化通信结构。

在π演算中,一个系统被表述成一组具有独立功能的进程集,集合中的每个进程可以与其它进程建立连接,每个连接都有一个连接名。

Darwin采用π演算对系统行为进行建模,利用其强类型系统进行静态检查。

此外,Darwin使用π演算作为其形式化基础,因此使用Darwin描述的体系结构模型能够进行一些高层的模型检测,例如是否存在死锁等。

2、Darwin的建模能力和特点:使用Darwin描述的软件系统配置主要由构件及构件之间的绑定(binding)组成。

Darwin中的构件是用服务(service)进行定义的,一个构件既能对外提供一些服务,也能请求外部的服务。

所有的服务名的作用范围仅限于定义这些服务的构件,亦即构件的定义本身并不需要了解全局的服务名。

因此Darwin中的构件是上下文独立的(context independent),这有助于构件的复用,并能简化维护阶段对构件的替换工作。

构件的服务由服务类型进行区分,但是Darwin本身并不解释服务类型信息。

服务类型信息要么由低层的形式化行为规约进行解释,要么用于表示底层分布式平台所支持的通信机制(例如在Regis系统中,类型信息就可以直接用于选择正确的通信代码)。

3、Darwin中的构件:Darwin中的绑定就是构件的provide服务和require服务之间的链接。

只有provide服务类型和require服务类型相互匹配,相应的绑定才是合法的。

由于Darwin本身只管理服务类型,并不对其进行解释,因此必须由提供服务类型的系统来判断服务是否匹配(不过在Darwin目前的工具集中,仅仅简单的通过名字是否相同来判断服务是否匹配)。

从苹果看开源与闭源

从苹果看开源与闭源

从苹果看开源与闭源在开始讨论之前,我们先来弄清这样几个概念。

首先是苹果的操作系统iOS。

iOS是由苹果公司为iPhone开发的操作系统。

它主要是给iPhone、iPod touch 以及iPad使用。

就像其基于的Mac OS X操作系统一样,它也是以Darwin为基础的。

原本这个系统名为iPhone OS,直到2010年6月7日WWDC大会上宣布改名为iOS。

iOS的系统架构分为四个层次:核心操作系统层,核心服务层,媒体层,可轻触层。

系统操作占用大概240MB的存储器空间。

然后是开源,即开放源代码。

许多人将开放源代码与自由软件视为相同,但若以定义条件而言,自由软件仅是开放源代码的一种,也就是自由软件的定义较开放源代码更为严格,并非开放源代码的软件就可称为自由软件,要视该软件的授权条件是否合乎自由软件基金会对自由软件所下的定义。

最后是闭源。

闭源是发明作为开源的反义词的一个术语和被用于指任何没有资格作为开源许可术语的程序。

一般地,它意味着将仅获得它们许可的计算机程序的一个二进制版本而没有这个程序的源代码,软件的翻译修改从技术方面几乎是不可能的。

这个发展模型的源代码被看作这个公司的商业秘密,因此可能获得源代码接入的团体,例如学校,必须提前签订不泄漏协议。

乔布斯早就说过:能做海盗,为什么做海军?抄袭,或者更直白点,抢,正是海盗的日常行为。

第三方多任务,Tethering ,文件夹⋯⋯iOS 的每一次进化,都要有一些Cydia 上的第三方开发者被苹果“微创新”。

甚至,Cydia 之外的开发者也不是第一次倒霉。

Admob ,Openfeint 的悲剧还历历在目。

Tapjoy 恐怕也快遭毒手。

多年来,苹果的行为的逻辑是一贯的,并非在前几天才突然改变。

还有一滩比抄袭更壮观的口水战:开源和闭源。

从PC 系统的Windows VSLinux 开始愈演愈烈,到今天没有结果。

移动系统上,这场论战再次上演:Android VS iOS 。

iperf 源码解析

iperf 源码解析

前段的项目中要解决提高系统性能并增强系统稳定性的问题,涉及到中断均衡,google了不少相关资料,多限于基本原理的讲解或软件的使用。

无奈之下,到找了份代码,虽尚有不太明白的地方(中英名词对应,^_^),但却解决了自己遇到的问题,甚是欣慰。

也再次印证了一点:源码在手,一目了然!这里对源码作简单的分析(irqbalance-0.55 source)。

一、irqbalance针对双核以及超线程采用共享缓存的系统只处理一次设备中断均衡,也即以静态方式分配各设备中断对应的CPU。

(这点表明在双核及单核系统中启动irqbalance,并不会影响系统资源,因为irqbalance在做完中断均衡相关判断、处理后即退出)二、irqbalance可以对指定的CPU不进行中断均衡分配,或者说指定CPU不参与中断均衡分配;三、生成cpu树,获取初始设备中断统计信息(各设备当前发生的中断信息);四、睡眠;五、获取当前设备中断统计信息;六、获取以NUMA模式工作的pci设备中断统计信息;七、计算每个设备的中断量;八、开始中断均衡循环;九、睡眠;十、检测电源当前工作模式(省电模式/高性能模式);十一、若CPU数量发生变更,则重新扫描;十二、计算以NAPI模式工作的网卡其对应的中断量;十三、计算各设备中断量;十四、更新以NUMA模式工作的设备的中断统计信息;十五、计算各设备中断接下来最适合的对应CPU;十六、执行中断均衡,即修改各设备中断对应的CPU;十七、回到第九步;在做均衡选择时irqbalance充分考虑了CPU的特性以及NUMA、NAPI等机制带来的对中断的影响。

以CPU为例:<img src="/photo/110309_100114144248.jpg" />在选择CPU时,irqbalance考虑了cpu同处一个L2 cache,同处一个packages(不知中文用哪个词来对应)的情况,以便选择真正合适的cpu,而不是貌似合适的cpu来处理某一设备的中断。

源代码说明文档范文

源代码说明文档范文

源代码说明文档范文参考:这种说明性文档一般是使用Text Macros来做的Text Macros一般被翻译为文本宏,它是Xcode隐藏的特性,XCode 9.0后,Apple 允许开发者进行自定义文本宏。

文本宏(Text Macro)是一种可以就地展开(expanded in-place)为特定文本的符号。

其常见于Xcode文件模板中.Xcode在使用文件模板创建文件时,会把文件模板中的文本宏,展开生成特定的文本,比如如使用NSObjectObjective-C文件模板创建一个文件名为MyObject.m的文件时,FILEHEADER会展开生成头部注释信息,FILEBASENAME会展开生成字符串MyObject,FILEBASENAMEASIDENTIFIER会展开生成字符串MyObjectXcode模板有文件模板和工程模板。

模板文件按照开发平台存放,其中每个平台的模板位置如下:•macOS平台模板:/Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates •iOS平台模板:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates•tvOS平台板:/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVOS.platfo rm/Developer/Library/Xcode/Templates•watchOS平台模板:/Applications/Xcode.app/Contents/Developer/Platforms/WatchOS.platform /Developer/Library/Xcode/Templates举个例子:通过XCode建立一个基于Objective-C项目,名为TextMacrosDemo,建立一个Person类,生成了Person.h和Person.m这两个文件:查看文件模板:$ open /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platfor m/Developer/Library/Xcode/13.png14.png打开 ___FILEBASENAME___.h会看到:而___FILEBASENAME___.m对应:XCode 就是根据文件模板创建的文件,在文件模板中就是使用的文本宏Text Macros. 假如我们在___FILEBASENAME___.m里添加一些代码:新建类Hello,可见Hell.m内容为:一般做法在源代码文件头部加上一些信息说明,不推荐上面那种直接修改模板文件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Apple公司Darwin流式服务器源代码分析(尉明) 当前,伴随着Internet的飞速发展,计算机网络已经进入到每一个普通人的家庭。在这个过程中,一个值得我们关注的现象是:Internet中存储和传输内容的构成已经发生了本质的改变,从传统的基于文本或少量图像的主页变为大容量、富信息量的流式媒体信息。一份早在1998年提交的研究报告就曾指出,流式媒体统治Internet的潮流是不可抗拒的,该报告估计到2003年,存储在网络服务器上的内容超过50%的将是流式媒体信息。但今天看来,这个估计还是有些保守了。 所谓的流式媒体简单的讲就是指人们通过网络实时的收看多媒体信息:如音频流、视频流等。与流式媒体对应的传统工作方式是下载+播放模式,即用户首先下载多媒体文件,然后再在本地播放,这种方法的一个主要缺点是启动延迟较大,例如一个30分钟长的MPEG-I文件(相当于VCD质量),即使使用1.5Mbps的速率下载,也需要半个小时才能完成,这样一个漫长的等待时间实在是无法忍受。在窄带网络环境中,几乎所有基于Internet的流式媒体产品都有着类似的工作原理:首先需要开发高效的压缩编码技术,并通过一套完整有效的传输体系将其发布到用户的桌面上。目前在流式媒体领域,有三种占有主导地位的产品,它们分别是Apple公司的Quick Time、Microsoft公司的Media Server以及Real公司的Real System。本文将介绍QuickTime技术及其开放源代码的Darwin流化服务器。

1 QuickTime技术介绍 Apple公司近日发布了QuickTime 5及QuickTime Streaming Server 3(简称QTSS)。作为客户端的QuickTime 5是用于在Internet上对高质量音频和视频内容进行创建、播放及提供数字流的软件,目前QuickTime在全世界的使用量已经超过1亿5千万份。QuickTime Streaming Server 3是Apple基于标准的、开放式源代码的流式服务器软件的新版本,它包括以下新功能:跳读保护(Skip Protection),一项获得专利的特性组合,它可以保证Internet上数字流的质量,防止中断;全新的易于使用、基于Web的界面,用户可以在本地或远程进行管理,实现服务器配置。作为Internet流媒体联盟(ISMA)的创建者之一,Apple不断致力于开⒎弦到绫曜嫉牟泛图际酰ü岣呋ゲ僮餍岳从呕没У氖褂锰逖椋壳癚uickTime已被国际标准组织(ISO)选为MPEG-4的基本文件格式,可预见Apple将有更多MPEG-4 产品和技术的推出。 QuickTime正迅速成为世界领先的跨平台多媒体技术,而且是迄今为止唯一的开放式源代码、基于标准的数字流解决方案。ZDNet在2000年9月对于三种流式媒体服务器的特征比较说明了QTSS不仅仅被技术开发者关注,而且可以通过简单的定制成为成熟强大的产品,评测结果可见表1。 表1 ZDNet对三类产品的评测结果 服务器模块 QTSS 2.01 Media Server 7 RealServer Basic 7 操作系统支持 Windows NT, 2000; FreeBSD; Linux; Mac OS; Solaris Windows NT, 2000 Windows NT, 2000 并发流个数 2,000 2,000 25 free/3000 pro 现场直播和广播 Yes Yes Yes 在线广告支持 Yes Yes Yes PPV/流加密 No / No Yes / Yes Yes / Yes 分配流能力 No Yes Yes SMIL标准支持 Yes No Yes RTSP标准支持 Yes No Yes 多播支持 Yes Yes Yes 状态报告 Yes Yes Yes 服务器日志 Yes Yes Yes 防火墙和代理支持 Yes Yes Yes 远程监控 Yes Yes Yes 客户可以使用QuickTime Player或其他支持QuickTime的应用程序在Windows或Macintosh平台上接收视频流,而且QuickTime Player可以从苹果公司的网站上下载免费使用。如果安装了QuickTime的插件,客户还可以直接通过浏览器收看。 客户希望点播一个节目时,QuickTime Player或插件将向QTSS发送请求,指明要点播的节目名。如果该节目存在,QTSS将向客户发送相应的视频流。当客户希望收看现场直播(或实时广播)时,它首先从QTSS获得关于当前频道的编码格式、地址等相关信息,然后再接受该频道的媒体流。 对于那些希望在Internet上实时流化视频或音频信息的用户,QTSS服务器将是一个很好的选择,通过它可实现多项任务,例如: 创建一个24小时在线的Internet广播电台; 现场实况转播:如公司会议、体育节目等; 创建远程学习站点:如能够点播视频和演讲; 图1是一个利用QTSS服务器建立的现场直播场景。

2 Darwin流化服务器介绍 Darwin Streaming Server(简称DSS)是QuickTime Streaming Server开放式源代码的版本,同时支持FreeBSD、Linux、Solaris、Windows NT和Windows 2000等多个操作系统,是当前所有同类产品中支持平台最多的一个。DSS的源代码和相关文档可从以下站点获得:http://www.apple.com DSS源代码完全采用标准C++语言写成,编程风格非常优秀,每个C++类都对应着一对和类同名的.h/.cpp文件。但是由于大量采用了面向对象的概念,如继承、多态等等;而且源文件和类相当多,所以不太容易讲清楚。因此,读者最好事先把代码完整的过滤一两遍,再配合本文,就能看得更清楚点。 整个服务器包括多个子系统,分别存放在独立的工程内,如图2所示。

其中,最为重要的是基础功能类库(CommonUtilitiesLib)和流化服务器(StreamingServer)两个工程,前者是整个系统的通用代码工具箱,包括了线程管理、数据结构、网络和文本分析等多个功能模块。DSS和其他相关的工具使用基础功能类库工程中定义的功能类实现以下三个目标: (1)抽象出系统中相同或类似的功能,用于降低代码的冗余度; (2)封装基本功能,简化高层编码的复杂度; (3)隔离开操作系统平台相关的代码。 而流化服务器工程中包含了DSS对多个国际标准的实现,是整个服务器的主工程。在本文中,我们将重点分析这两个工程中的核心代码和模块。另外,我们还将简单介绍利用DSS提供的开发接口(Module)扩展和定制服务器的方法。 DSS实现了四种IETF制定的国际标准,分别是:实时流传输协议RTSP(Real-time Streaming Protocol, RFC 2326)、实时传输协议(RTP Real-time Transfer Protocol,RFC 1889)、实时传输控制协议RTCP(Real-time Transport Control Protocol,RFC 1889)、会话描述协议SDP(Session Description Protocol,RFC 2327)。这四个标准是开发所有流式媒体产品都必须掌握的,因此在对相关代码进行分析和二次开发之前,希望读者了解上述四种协议的基本思想,上述协议样本可从以下网站获得:http://www.ietf.org

3 基础功能类库(Common Utilities) 3.1 OS类 Darwin Streaming Server支持包括Windows,Linux以及Solaris在内的多种操作系统平台。我们知道,Windows和Unix(或Unix-like)操作系统之间无论从内核还是编程接口上都有着本质的区别,即使是Linux和Solaris,在编程接口上也大为不同。为此,DSS开发了多个用于处理时间、临界区、信号量、事件、互斥量和线程等操作系统相关的类,这些类为上层提供了统一的使用接口,但在内部却需要针对不同的操作系统采用不同的方法实现。表2罗列出了DSS中的主要OS类和数据结构。 表2 DSS中的主要OS类和数据结构 类(数据结构)名 主要功能 OS 平台相关的功能类,如内存分配、时间等 OSCond 状态变量的基本功能和操作 OSMutex 互斥量的基本功能和操作 OSThread 线程类 OSFileSource 简单文件类 OSQueue 队列类 OSHashTable 哈希表类 OSHeap 堆类 OSRef 参考引用类 3.1.1 OSMutex/OSCond Class 在有多个线程并发运行的环境中,能同步不同线程的活动是很重要的,DSS开发了OSMutex和OSCond两个类用以封装不同操作系统对线程同步支持的差异。 我们首先分析OSMutex类,这个类定义了广义互斥量的基本操作,类定义如下: class OSMutex { 1 public: 2 OSMutex(); //构造函数 3 ~OSMutex(); //析构函数

4 inline void Lock(); //加锁 5 inline void Unlock(); //解锁 6 inline Bool16 TryLock(); //异步锁,无论是否成功立即返回

7 private: 8 #ifdef __Win32__ 9 CRITICAL_SECTION fMutex; //临界区 10 DWORD fHolder; //拥有临界区的线程id 11 UInt32 fHolderCount; //进入临界区线程数 //其他略… } 在Windows平台上,OSMutex类是通过临界区(CRITICAL_SECTION)来实现的,第10行定义了临界区变量fMutex。类实例化时构造函数调用InitializeCriticalSection(&fMutex)初始化临界区变量,对应的在析构函数中调用DeleteCriticalSection(&fMutex)清除。 Lock()函数用于对互斥量加锁,它调用私有方法RecursiveLock实现: void OSMutex::RecursiveLock() { // 当前线程已经拥有互斥量,只需增加引用计数 1 if (OSThread::GetCurrentThreadID() == fHolder) 2 { 3 fHolderCount++; //增加引用计数 4 return; 5 } 6 #ifdef __Win32__ 7 ::EnterCriticalSection(&fMutex); //申请进入临界区 8 #else 9 (void)pthread_mutex_lock(&fMutex); 10 #endif 11 Assert(fHolder == 0); 12 fHolder = OSThread::GetCurrentThreadID(); //更新临界区拥有者标志 13 fHolderCount++; 14 Assert(fHolderCount == 1); } 第1行检测如果当前线程已经拥有互斥量,就只需将内部计数fHolderCount加1,以便纪录正在使用互斥量的方法数。如果当前线程还没有得到互斥量,第7行调用EnterCriticalSection()函数申请进入临界区;如果当前已经有其他线程进入临界区,该函数就会阻塞,使得当前线程进入睡眠状态,直到占用临界区的线程调用LeaveCriticalSection(&fMutex)离开临界区后才可能被唤醒。一旦线程进入临界区后,它将首先更新临界区持有者标志(第12行),同时将临界区引用计数加1。 注意到另外一个函数TryLock(),该函数也是用于为互斥量加锁,但与Lock()

相关文档
最新文档