<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_oayx</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/64027/rss</id><updated>2012-02-29T05:09:46Z</updated><author><name>oayx</name><uri>http://www.cnblogs.com/lancidie/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lancidie/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/64027/rss"/><entry><id>http://www.cnblogs.com/lancidie/archive/2012/02/29/2373256.html</id><title type="text">[探讨]Facebook是如何做自动化测试的？</title><summary type="text">导读：最近，在国外知名问答网站Quora上有个讨论，原意是：“Facebook是如何做自动化测试的，他们是怎样测试才能保证每周的升级都可以不出差错的呢？” 引发了开发者们的激烈讨论。来自Facebook的Steven Grimm很好地回答了这个问题，觉得还不错，这里以第一人称翻译了一下。对于PHP的代码，我们写了非常多的基于PHPUnit测试框架的测试类，这些测试类覆盖范围比较大，从简单的判读真假的单元测试到大规模的后端服务的集成测试。开发人员把运行这些基于PHPUnit的测试用例作为他们工作中的一部分，同时这些用例也在一些专用的设备上不停地被运行（注：持续集成模式）。当开发人员对一些代码做了</summary><published>2012-02-29T05:09:00Z</published><updated>2012-02-29T05:09:00Z</updated><author><name>oayx</name><uri>http://www.cnblogs.com/lancidie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lancidie/archive/2012/02/29/2373256.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lancidie/archive/2012/02/29/2373256.html"/><content type="html">&lt;p&gt;&lt;strong&gt;导读：最近，在国外知名问答网站&lt;/strong&gt;&lt;a href="http://www.quora.com/What-kind-of-automated-testing-does-Facebook-do" target="_blank"&gt;&lt;strong&gt;Quora&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;上有个讨论，原意是：&amp;#8220;Facebook是如何做自动化测试的，他们是怎样测试才能保证每周的升级都可以不出差错的呢？&amp;#8221; 引发了开发者们的激烈讨论。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;来自Facebook的Steven Grimm很好地回答了这个问题，觉得还不错，这里以第一人称翻译了一下。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;对于PHP的代码，我们写了非常多的基于PHPUnit测试框架的测试类，这些测试类覆盖范围比较大，从简单的判读真假的单元测试到大规模的后端服务的集成测试。开发人员把运行这些基于PHPUnit的测试用例作为他们工作中的一部分，同时这些用例也在一些专用的设备上不停地被运行（注：持续集成模式）。当开发人员对一些代码做了比较大的修改时，在开发机器上的自动化工具会运行这些测试用例的同时也会生成相应的代码覆盖率数据，对于需要提交到代码库的diff，在做代码review的时候回自动地产生一份带有覆盖率的测试报告。&lt;/li&gt;&lt;li&gt;对于前端的代码，我们使用Waitir（注：Waitir是前端UI的自动化测试框架）做了基于浏览器的界面自动化测试。这些测试用例涵盖了网站页面的功能，特别是针对隐私方面，比如：&amp;#8220;用户X发布了Y，而Y应该/不应该被用户Z看到&amp;#8221;，有着大量的基于浏览器级别的这种用例。（这些隐私规则当然也会使用一些更低级别的方法被测试到，但是这些规则的实现是必须要严格执行的，并有着非常高的优先级，因此这部分必须要有足够的测试用例来覆盖）&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;除了一些使用watir的全自动化用例以外，我们也有一些半自动化的测试。这些测试也使用了waitir技术，这样可以使一些表格填充或者点击button来完成整改界面上的流程的测试不太单调乏味，而且我们可以很清楚地检查和验证当前的步骤或流程是否正确合理。&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;我们也在尝试开始使用JSSpec （注：JavaScript单元测试框架）去做一些JavaScript代码的单元测试，但当前也是刚刚开始做。&lt;/li&gt;&lt;li&gt;对于后端服务的测试，根据不同的服务特性我们采用了许多不同的测试框架与方法。对于一些需要开源发布的项目，我们会使用开源的测试框架，像Boost和JUnit测试框架（注：Boost是针对C++/JUnit是针对Java的测试框架）；对于另外一些项目，可能永远都不会发布到外界，我们就是使用内部开发的可以很紧密地与我们build系统集成在一起的C++测试框架。还有少数项目会使用项目级别的测试工具。多数后端服务的测试都会紧紧地和持续集成/Build系统结合在一起，这些持续集成的build系统会不停地针对源代码自动地运行测试用例并生成测试结果，测试结果在存储在数据库的同时会发送到通知系统中去。&lt;/li&gt;&lt;li&gt;HipHop(注：HipHop for PHP是Facebook的PHP项目)有一套类似的持续集成系统，HipHop的单元测试和所有基于PHPUnit的测试都会被运行。所有的这些测试结果会和基于普通的PHP解释器的结果做对比，从而可以看到不同PHP上的行为的不同；&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Facebook的测试工具将测试结果存储在数据库的同时会发送一份通知邮件，这个邮件会包含执行失败的信息并且邮件的接收范围是开发同学可以自己调整的。（例如，你可以选择只有在测试连续失败一段时候的时候才接收到通知邮件，或者当一个用力失败的时候立刻收到通知）。在浏览器UI上，测试结果和 缺陷/开发任务跟踪系统会结合在一起，可以很容易的将测试失败与开发任务关联起来。&lt;/p&gt;&lt;p&gt;测试中一个非常重要的现象是&amp;#8220;导致阻塞&amp;#8221;，也就是一个测试用例失败有可能会阻止发布（在Facebook，有发布工程师会来评估是否可以将带有问题的代码发布到生产环境，发布工程师在必要的情况下会得到授权去阻止产品的发布）。阻止产品发布上线的事情是被认为是非常严重的问题，因为在Facebook大家对于这种快速发布的模式是深深引以为豪的。&lt;/p&gt;&lt;p&gt;我所在的团队是测试工程部门，主要职责是打造通用基础工具，这些工具会被上述的所有人用到，同时我们也在维护测试框架，像PHPUnit和Watir。Facebook没有专职的测试团队，所有的工程师都需要为他们的代码写自动化测试用例，并维护这些测试用例，保证产品代码改变的同时这些测试代码可以正确地运行。&lt;/p&gt;&lt;p&gt;Facebook的测试还处于一个初期起步尝试阶段，上面的介绍都只是我们在当前运行的方法而已。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lancidie/aggbug/2373256.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lancidie/archive/2012/02/29/2373256.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lancidie/archive/2012/02/07/2341299.html</id><title type="text">译Variance Shadow Maps</title><summary type="text">发现这个阴影技术几乎没有中文版的详细讲解，姑且完整翻译一遍论文。Variance Shadow MapsWilliamDonnellyAndrew LauritzenWaterloo大学，计算机科学，图形实验室Winger_w译水平有限，错误指出欢迎指出QQ:379404629Figure1：各向异性过滤对比。上：普通shadow map，利用PCF。下：Varianceshadow map利用mipmapping和16x的各项异性过滤。摘要在实时渲染中，Shadowmaps是一种被广泛采用的阴影技术。此技术的一个主要缺点是，像普通纹理那样采样，会产生严重的锯齿。本文介绍一种新的实时渲染阴影算</summary><published>2012-02-07T04:10:00Z</published><updated>2012-02-07T04:10:00Z</updated><author><name>oayx</name><uri>http://www.cnblogs.com/lancidie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lancidie/archive/2012/02/07/2341299.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lancidie/archive/2012/02/07/2341299.html"/><content type="html">&lt;div id="blog_text" class="cnt"&gt;&lt;p&gt;发现这个阴影技术几乎没有中文版的详细讲解，姑且完整翻译一遍论文。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Variance Shadow Maps&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;WilliamDonnelly&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;Andrew Lauritzen&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Waterloo&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;大学，计算机科学，图形实验室&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Winger_w&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;译&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;水平有限，错误指出欢迎指出&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;QQ:379404629&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Figure1&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;：各向异性过滤对比。上：普通&lt;/span&gt;&lt;span&gt;shadow map&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，利用&lt;/span&gt;&lt;span&gt;PCF&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;。下：&lt;/span&gt;&lt;span&gt;Varianceshadow map&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;利用&lt;/span&gt;&lt;span&gt;mipmapping&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;和&lt;/span&gt;&lt;span&gt;16x&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的各项异性过滤。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体"&gt;摘要&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;在实时渲染中，&lt;/span&gt;&lt;span&gt;Shadowmaps&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;是一种被广泛采用的阴影技术。此技术的一个主要缺点是，像普通纹理那样采样，会产生严重的锯齿。本文介绍一种新的实时渲染阴影算法&amp;#8212;&amp;#8212;&lt;/span&gt;&lt;span&gt;variance shadow maps&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;。不同于传统的&lt;/span&gt;&lt;span&gt;shadow map&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;保存一个深度值，我们将保存深度和深度的平方，利用他们可以计算纹理采样区域的方差。利用方差，我们可以计算出一个像素被遮挡的概率上限。我们会看到，这个概率值，非常接近现实的软阴影，并且可以用于实时渲染。我们的算法很容易在&lt;/span&gt;&lt;span&gt;GPU&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;上运行，只需额外的存储一点点数据。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;1&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;引言&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Shadow maps [Williams 1987]&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;和阴影体&lt;/span&gt;&lt;span&gt;(shadow volumes)[Crow 1977]&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;是两个常见的阴影渲染算法。&lt;/span&gt;&lt;span&gt;Shadow maps&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;相对于阴影体有很多优点；例如，他更容易的被执行，对模型复杂度不太敏感，并且没有特殊的几何空间要求。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;不幸的是，就像大多数纹理一样，&lt;/span&gt;&lt;span&gt;shadow maps&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;如果过滤不当，会产生显眼的锯齿。现代显卡支持一些过滤方式来减少普通纹理产生的锯齿，他们是：&lt;/span&gt;&lt;span&gt;mip mapping&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;和各项异性过滤。这些技术不适用于标准的&lt;/span&gt;&lt;span&gt;shadow maps&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，因为他只会简单的将&lt;/span&gt;&lt;span&gt;shadow map&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;中的深度值与周围几个点做线性插值。典型的实时渲染做法是，取当前相邻几个点的深度值，依次比较，将结果取平均值。这种做法的代价是昂贵的，因为显卡没有对此做优化。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;为了有效解决&lt;/span&gt;&lt;span&gt;shadow maps&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的过滤问题，我们注意到标准的&lt;/span&gt;&lt;span&gt;shadow map&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;只保存了单独一个点的深度信息。方差&lt;/span&gt;&lt;span&gt;shadow maps&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的每个像素将保存区域深度信息。为了用尽量少的数据来描述这个信息，我们存储两个数据：深度和深度的平方。这样做的主要优点是我们可以用它来近似描述一个区域深度信息。（这句话，有太好翻译，原文如下：&lt;/span&gt;&lt;span&gt;One major advantage of this representation is that we canapproximate the average of two distributions by averaging the moments.&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;在采样方差&lt;/span&gt;&lt;span&gt;shadow map&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;时，我们用这两个数据来计算当前像素所在区域的一个散列值界限。我们会看到，这个界限值会很好的模拟出每个光源投射到任意表面的软阴影。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;因为这两个数据能被插值，我们可以像普通纹理采样那样，基于硬件的支持做一个大范围的过滤来减少锯齿。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;2&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;相关研究&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Williams&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;介绍了&lt;/span&gt;&lt;span&gt;shadow maps&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;这样一个有效的阴影算法。然而，他指出普通的颜色纹理过滤技术不适用于&lt;/span&gt;&lt;span&gt;shadow maps&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;PCF(Percentage closer filtering)[Reeves et al.1987]&lt;span style="font-family: 宋体"&gt;提供了一个解决方案。他的实质是将深度信息做多次比较。这需要多次纹理采样才能消除锯齿。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Deep shadow maps[Lokovic and Veach 2000]&lt;span style="font-family: 宋体"&gt;保存区域的多个深度值来替代单一点的深度信息。&lt;/span&gt;&lt;span&gt;Deep shadow maps&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;很难在显卡上高效运行，有两个原因：每个像素&lt;/span&gt;&lt;span&gt;shade&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;需要大量深度数据，同时，求平均值也会消耗额外的时间。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Opacity shadow maps [Kim and Neumann 2001]&amp;nbsp;&lt;span style="font-family: 宋体"&gt;也类似&lt;/span&gt;&lt;span&gt;Deep shadow maps&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;存储区域深度信息，不过他通过存储固定数量的信息来实现。这个算法有相对较高的效率。&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;没研究过这个算法，原文讲的也含糊不清，列出：&lt;/span&gt;&lt;span&gt;Opacity shadow maps [Kim and Neumann 2001] encode a&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;distribution of depths, but use a fixedamount of storage per pixel. Each pixel stores a function just as in deepshadow maps, but instead the function is constructed from its values at a fixedset of points. Thus the algorithm can take advantage of the speed of graphicshardware. The price to pay for this flexibility is extreme quantization ofdepths, so the technique is mostly suitable for rendering of dense volumetric objectssuch as hair and fur.)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;另一种解决&lt;/span&gt;&lt;span&gt;shadow map&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;锯齿的方法是改变投影矩阵。他们是&lt;/span&gt;&lt;span&gt;adaptive shadow maps[Fernando et al.2001], Perspective shadow maps [Stamminger and Drettakis 2002],Light space perspective shadow maps [Wimmer et al.2004], trapezoidal shadowmaps [Martin and Tan 2004].&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;这些算法与上述算法是互补的，因为他们并没有对投影矩阵做任何要求。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;一些显卡支持&lt;/span&gt;&lt;span&gt;shadow maps&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，比如&lt;/span&gt;&lt;span&gt;OpenGL&amp;#8221;GL_ARB_Shadow&amp;#8221;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;。但是这个特性并不能做插值或者&lt;/span&gt;&lt;span&gt;mipmapping&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;。一些&lt;/span&gt;&lt;span&gt;NVIDIA&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;显卡处理器支持双线性过滤&lt;/span&gt;&lt;span&gt;[Everitt et al.2000]&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，但是据我所知，没有显卡支持三线性或者各向异性过滤用在&lt;/span&gt;&lt;span&gt;shadowmaps&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;上。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;3&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;算法概述&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;在传统的&lt;/span&gt;&lt;span&gt;shadowmapping&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;中，我们先在光源处渲染场景，保存距离光源的深度；在&lt;/span&gt;&lt;span&gt;variance shadow maps&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;中，我们渲染一个有两个通道的缓冲区，保存深度和深度的平方。虽然常规的&lt;/span&gt;&lt;span&gt;shadow map&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;不会利用任何纹理过滤方式来采样深度值，但是在&lt;/span&gt;&lt;span&gt;variance shadow map&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;中，我们将得益于此。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;曾经我们对&lt;/span&gt;&lt;span&gt;shadow map&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;做了一些过滤处理。包括生成&lt;/span&gt;&lt;span&gt;mipmaps [Willliams1983]&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;或者计算累加区域内的数据&lt;/span&gt;&lt;span&gt;(summedarea tables)[Crow 1984]&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;。现在，我们的&lt;/span&gt;&lt;span&gt;variance shadow maps&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;同样可以通过模糊处理来柔化阴影。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;我们保存深度和深度的平方到纹理中，这两个信息在采样时就会被过滤。（注：过滤实际上就是一种求平均值）我们将这两个通道的值定义为&lt;/span&gt;&lt;span&gt;M1 M2&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，如下所示：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;通过他们我们可以计算出方差：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;方差可以理解为一个描述区域信息的值。我们可以利用方差来计算一个大于某一变量的概率界限。&lt;/span&gt;&lt;span&gt;Chebyshev&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;公式做了具体描述。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;设&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;为一个在过滤区域中变化的随机深度值，再设&lt;/span&gt;&lt;span&gt;t &amp;gt; &amp;#956;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;上述公式中的&lt;/span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，描述了区域内大于某个值的概率，具体的，如果这个&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;就是我们需要比较的当前深度值，那么，&lt;/span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;就可以理解为处于阴影中的概率。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;虽然，公式&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;只给出了一个上限，但是，他可以很好的近似描述出软阴影效果。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;3.1&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 黑体"&gt;平面阴影遮挡&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;考虑这样的情况，一个平面遮挡物，深度为&lt;/span&gt;&lt;span&gt;d1&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，他投射阴影到另一个平面，此平面的深度为&lt;/span&gt;&lt;span&gt;d2&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;（注解：平面深度固定就表面他们是平行的，且垂直于光源视线，他们两个平面深度的插值可认为是&lt;/span&gt;&lt;span&gt;mipmap&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;）。假设没有被遮挡时，&lt;/span&gt;&lt;span&gt;d1,d2&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;有混合参数&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;（&lt;/span&gt;&lt;span&gt;mipmap&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;混合），然后我们可以得到：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;通过公式&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，我们可以计算出：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;我们可以看到，在这种简单情况下，&lt;/span&gt;&lt;span&gt;Chebyshev&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;不等式给出的值就等于我们的过滤参数。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;虽然这是一种很特殊的情况，但是他提供了一个近似值，适用于大多数场景。在一个只有单独阴影遮挡物和接受物的场景中，我们只需少量采样投射物或者接受物的深度，因为他们的误差非常小。这种情况下，公式&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;并没有提供一个精确值，但是误差已经足够小了。这样，我们可以认为&lt;/span&gt;&lt;span&gt;pmax&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;是一个理想的近似值。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;4&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;具体实现&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;我们在&lt;/span&gt;&lt;span&gt;Geforce6800GT&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;上实现&lt;/span&gt;&lt;span&gt;VSM&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Geforce6&lt;span style="font-family: 宋体"&gt;系列显卡支持&lt;/span&gt;&lt;span&gt;16&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;位浮点纹理，我们利用硬件支持的&lt;/span&gt;&lt;span&gt;mipmapping&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;和各项异性过滤来实现&lt;/span&gt;&lt;span&gt;vsm&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;。我们的实现步骤大致如下：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;1．&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;以光源为视点，渲染一个&lt;/span&gt;&lt;span&gt;16&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;位浮点纹理，他保存深度和深度的平方。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;2．&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;如果喜欢的话，我们可以用第二个&lt;/span&gt;&lt;span&gt;pass&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;将纹理进行高斯模糊。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;3．&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;OpenGL&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;会自动生成&lt;/span&gt;&lt;span&gt;Mipmaps&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;4．&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;正常渲染场景。我们读取&lt;/span&gt;&lt;span&gt;shadow map&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;中的&lt;/span&gt;&lt;span&gt;M1&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;（深度），&lt;/span&gt;&lt;span&gt;M2&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;（深度平方）。如果&lt;/span&gt;&lt;span&gt;depth&amp;lt; &amp;#956;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;（平均深度，即&lt;/span&gt;&lt;span&gt;M1&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;），则此像素不在阴影中。否则，我们利用&lt;/span&gt;&lt;span&gt;M1&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，&lt;/span&gt;&lt;span&gt;M2&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;计算方差，利用公式&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的&lt;/span&gt;&lt;span&gt;pmax&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;来调适光照。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;我们还利用&lt;/span&gt;&lt;span&gt;32&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;位浮点纹理来保存&lt;/span&gt;&lt;span&gt;shadow map&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;。因为我们的硬件还不支持在这个精度上进行过滤，所以，我们在像素&lt;/span&gt;&lt;span&gt;shader&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;里进行双线性差值。理论上，我们还可以在&lt;/span&gt;&lt;span&gt;shader&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;中进行&lt;/span&gt;&lt;span&gt;mipmapping&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;和各项异性过滤；然而，他运行的非常缓慢。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;我们也可以按照以下方法执行一些比较来过滤&lt;/span&gt;&lt;span&gt;shadow map&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;。他们基于一张没进过过滤的&lt;/span&gt;&lt;span&gt;16&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;位浮点纹理。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;1．&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;简单的利用周围相邻点做深度比较。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;2．&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;取四个相邻点做比较，并进行双线性插值。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;3．&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;将四个相邻点的比较值，用高斯模糊化。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;4．&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;取四点比较，每个点进行双线性插值，然后进行高斯模糊。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;5&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;结论&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Figure2&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;展示了利用&lt;/span&gt;&lt;span&gt;mipmapping&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;时的结果。就像普通纹理那样，&lt;/span&gt;&lt;span&gt;mipmapping&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;有效的减少了阴影锯齿。各项异性过滤也可用于&lt;/span&gt;&lt;span&gt;vsm&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，当视角很平时，也能够有效消除锯齿（如&lt;/span&gt;&lt;span&gt;figure 1&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;）。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Figure2&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;：无&lt;/span&gt;&lt;span&gt;Mipmapping&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;（左）&lt;/span&gt;&lt;span&gt; Mipmapping&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;（右）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Figure3&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;：从左到右：&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;）标准&lt;/span&gt;&lt;span&gt;shadowmapping&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;）&lt;/span&gt;&lt;span&gt;5x5 PCF&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;）&lt;/span&gt;&lt;span&gt;5x5&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;双线性过滤&lt;/span&gt;&lt;span&gt;PCF&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;）&lt;/span&gt;&lt;span&gt;VSM&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;利用&lt;/span&gt;&lt;span&gt;5x5&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;高斯模糊&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Figure4&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;：&lt;/span&gt;&lt;span&gt;当过滤区域的方差很大时，光照渗透现象将会出现。车的圆形区域（此图实在太模糊，看不清&lt;/span&gt;&lt;span&gt;~~~&lt;/span&gt;&lt;span&gt;）应该是一个彻底&lt;/span&gt;&lt;span&gt;(Solid)&lt;/span&gt;&lt;span&gt;的黑影。注意到这来的深度差异很大，所以光照渗透现象很容易看出来&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Figure3&amp;nbsp;&lt;span style="font-family: 宋体"&gt;展示了利用各种过滤方式的&lt;/span&gt;&lt;span&gt;vsm&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;效果对比。可以看出&lt;/span&gt;&lt;span&gt;vsm&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的效果要好很多。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;5.1&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 黑体"&gt;光照渗透问题（&lt;/span&gt;&lt;span&gt;Light Bleeding&lt;/span&gt;&lt;span style="font-family: 黑体"&gt;）&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;我们的&lt;/span&gt;&lt;span&gt;pmax&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;在大多数情况下是一个小范围变化的变量。但是他毕竟不是一个精确值。从公式&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;我们可以看出，方差肯定大于&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，无论&lt;/span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;为什么值，&lt;/span&gt;&lt;span&gt;pmax(d)&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;始终大于&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;。当方差很小时，&lt;/span&gt;&lt;span&gt;pmax&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;将会很快的向&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;逼近，所以渗透现象不那么显眼。然而，当方差很大时，就像&lt;/span&gt;&lt;span&gt;Figure4&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;那样，会很明显的渗透现象。（应该被遮挡显示为阴影的地方，出现了光照）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;实际上，这个问题只会发生在深度变化很大的场景中。除此之外，&lt;/span&gt;&lt;span&gt;vsm&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;工作良好。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;5.2&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 黑体"&gt;性能&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;我们选择了一个单聚光灯场景用作各种&lt;/span&gt;&lt;span&gt;shadow map&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;效率的对比，如&lt;/span&gt;&lt;span&gt;Figure1&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;所示。因为所有操作都在图片空间中，所有效率与场景的几何复杂度无关。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;VSM&lt;span style="font-family: 宋体"&gt;我们采用了&lt;/span&gt;&lt;span&gt;mipmapping&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;线性过滤，和&lt;/span&gt;&lt;span&gt;16x&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的各项异性过滤。其他算法的过滤方式不被硬件支持，我们在&lt;/span&gt;&lt;span&gt;shader&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;中实现。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;我们在&lt;/span&gt;&lt;span&gt;GeForce6800GT&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;上，用一秒渲染的帧数来衡量性能。先看看用不同&lt;/span&gt;&lt;span&gt;shadow map&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;支持，渲染到&lt;/span&gt;&lt;span&gt;1024x768&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的颜色缓冲区的效率对比：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;再看看都采样&lt;/span&gt;&lt;span&gt;512x512&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的&lt;/span&gt;&lt;span&gt;shadow map&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，但是不同的目标缓冲区分辨率的对比：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;我们注意到&lt;/span&gt;&lt;span&gt;PCF&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;对&lt;/span&gt;&lt;span&gt;shadow map&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的尺寸并不敏感，但是屏幕分辨率对他的影响较大。相比较的，&lt;/span&gt;&lt;span&gt;VSM&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;对屏幕分辨的影响和普通&lt;/span&gt;&lt;span&gt;shadow map&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;差不多。但是如果用一些预过滤操作，比如&lt;/span&gt;&lt;span&gt;VSM3x3&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的话，屏幕分辨率对&lt;/span&gt;&lt;span&gt;vsm&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的影响还是很大的。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;5.3&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 黑体"&gt;数字稳定性（&lt;/span&gt;&lt;span&gt;Numerical Stability&lt;/span&gt;&lt;span style="font-family: 黑体"&gt;）&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;从计算方差的公式&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;我们可以看出一些用浮点数运算的隐患。当方差与平均深度相差很小时，容易丢失精度。在实验过程中，我们发现这种错误有时会发生在&lt;/span&gt;&lt;span&gt;16&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;位的浮点&lt;/span&gt;&lt;span&gt;shadow map&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;上，但从来没出现在&lt;/span&gt;&lt;span&gt;32&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;位纹理上。我们希望未来的硬件能够支持&lt;/span&gt;&lt;span&gt;32&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;位浮点纹理的&lt;/span&gt;&lt;span&gt;mipmapping&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;已经各项异性过滤。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;6&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;结论&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;我们已经介绍完了方差&lt;/span&gt;&lt;span&gt;shadowmap&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，他是一个简单而有效的减少阴影锯齿方案。我们的计算结果基于一个区域内概率上限，他可以很好的模拟出真实的软阴影。最后，我们看到&lt;/span&gt;&lt;span&gt;vsm&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;非常适合于现代图形显卡，并比较了他与其他阴影技术之间的性能以及质量差异。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体"&gt;感谢&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;感谢&lt;/span&gt;&lt;span&gt;MichaelMcCool&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;和&lt;/span&gt;&lt;span&gt; StefanusDuToit&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;提供的帮助，以及&lt;/span&gt;&lt;span&gt;ChrisIacobucci&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;提供的车辆模型。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;img src="http://www.cnblogs.com/lancidie/aggbug/2341299.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lancidie/archive/2012/02/07/2341299.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lancidie/archive/2012/02/07/2341298.html</id><title type="text">各种Soft Shadow Mapping算法及推导过程</title><summary type="text">Shadow Mapping已经成为当前3D游戏的标配。传统SM+PCF可以很好地实现日光环境下的Hard Shadow，但如果要实现由昏暗灯光所产生的Soft Shadow，则要么效果过于生硬(sample次数少)要么效率低下(sample次数多)。因此，越来越多的游戏开始使用能够充分利用硬件特性的软阴影算法。这里主要总结各种Soft Shadow Mapping的算法思想和推导过程，不提及实现上的细节和具体代码，等有空再写写Demo。本文为原创内容，转载请注明出处。Standard Shadow MapsShadow Map的基本思想：Light View画一遍Depth，然后Camera</summary><published>2012-02-07T04:09:00Z</published><updated>2012-02-07T04:09:00Z</updated><author><name>oayx</name><uri>http://www.cnblogs.com/lancidie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lancidie/archive/2012/02/07/2341298.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lancidie/archive/2012/02/07/2341298.html"/><content type="html">&lt;p&gt;Shadow Mapping已经成为当前3D游戏的标配。传统SM+PCF可以很好地实现日光环境下的Hard Shadow，但如果要实现由昏暗灯光所产生的Soft Shadow，则要么效果过于生硬(sample次数少)要么效率低下(sample次数多)。因此，越来越多的游戏开始使用能够充分利用硬件特性的软阴影算法。&lt;br /&gt;这里主要总结各种Soft Shadow Mapping的算法思想和推导过程，不提及实现上的细节和具体代码，等有空再写写Demo。&lt;br /&gt;本文为原创内容，转载请注明出处。&lt;br /&gt;&lt;span id="more-109"&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;Standard Shadow Maps&lt;/strong&gt;&lt;br /&gt;Shadow Map的基本思想：Light View画一遍Depth，然后Camera View渲场景的时候，把Pixel坐标变换到Light Space，比较Depth即可（Pixel的Depth大于Shadow Map的Depth即在阴影区）。也可以直接是Screen Space对Depth Map做Post-processing。&lt;/p&gt;&lt;p&gt;传统方法可以用Percentage Closer Filtering解决锯齿问题，也很简单，Pixel坐标对应过去之后，比较周围的多个点，计算出阴影区的百分比。此外，还可以通过Bilinear Filter让阴影更平滑，跟PCF差不多，比较相邻的4个点，然后根据Texel的Offset做插值。值得注意的是，现在的GPU都支持Hardware Shadow Map，可以直接通过tex2Dproj( u, v, z, p )这条指令实现2x2PCF+BF。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Perspective Shadow Maps &amp;amp; Trapezoidal Shadow Maps&lt;/strong&gt;&lt;br /&gt;这两种方法沿用Shadow Map的基本思想。为了解决Shadow Map精度问题，对Depth Pass的变换矩阵做做手脚。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Variance Shadow Maps&lt;/strong&gt;&lt;br /&gt;VSM的想法很棒，可以说Soft Shadow是从VSM开始才往利用硬件Filter的方向发展。首先，也是Light View的Depth Pass，但是这次写入2个值，一个通道写入Depth，另一个通道写入Depth&lt;sup&gt;&lt;font size="2"&gt;2&lt;/font&gt;&lt;/sup&gt;。接着对出来的这张 [Depth, Depth&lt;sup&gt;&lt;font size="2"&gt;2&lt;/font&gt;&lt;/sup&gt;] 的Texture做Blur。直观上来讲，做Blur的结果就是取周围一定范围内的点的平均值（期望值），也就是Blur完之后得到一张 [E(Depth), E(Depth&lt;sup&gt;&lt;font size="2"&gt;2&lt;/font&gt;&lt;/sup&gt;)] 的Texture。有了这张Texture，后面便可以根据方差公式 V(Depth)=E(Depth&lt;sup&gt;&lt;font size="2"&gt;2&lt;/font&gt;&lt;/sup&gt;)-E(Depth)&lt;sup&gt;&lt;font size="2"&gt;2&lt;/font&gt;&lt;/sup&gt; 计算得到方差。&lt;/p&gt;&lt;p&gt;最后，根据Chebychev&amp;#8217;s inequality（切比雪夫不等式）&lt;br /&gt;&lt;span class="formula"&gt;P(x&amp;#8805;t) &amp;#8804;&amp;nbsp;&amp;#963;&lt;sup&gt;&lt;font size="2"&gt;2&lt;/font&gt;&lt;/sup&gt;/(&amp;#963;&lt;sup&gt;&lt;font size="2"&gt;2&lt;/font&gt;&lt;/sup&gt;+(t-&amp;#956;)&lt;sup&gt;&lt;font size="2"&gt;2&lt;/font&gt;&lt;/sup&gt;)&lt;/span&gt; 式中&amp;#963;&lt;sup&gt;&lt;font size="2"&gt;2&lt;/font&gt;&lt;/sup&gt;为方差V(Depth)，&amp;#956;为期望E(Depth)&lt;br /&gt;将Pixel坐标变换到Light Space之后的Depth代入t，即得到某个点周围一定范围内大于深度t的点的比率（注意切比雪夫不等式得到的只是一个范围&amp;#8804;，而这里近似的取不等式右侧的结果P&lt;sub&gt;&lt;font size="2"&gt;max&lt;/font&gt;&lt;/sub&gt;）。其实就是一个微分级别的PCF值，于是可以非常高效地得到平滑阴影。&lt;/p&gt;&lt;p&gt;很可惜的是，在Depth变化较大的区域（方差较大），VSM会有缺陷（Light bleeding）。因为根据切比雪夫不等式，在方差较大的情况下，(t-&amp;#956;)必须足够大，才能让不等式右边趋于0。于是又有了LVSM来解决这个问题。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Layered Variance Shadow Maps&lt;/strong&gt;&lt;br /&gt;为了解决VSM的Light bleeding，对VSM的Shadow Map进行分层，将每一层次里面的Depth区间控制在一定范围内，也就是降低可能出现的方差值。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Convolution Shadow Maps&lt;/strong&gt;&lt;br /&gt;CSM提出了一种非常好的图形学算法思路。其推导过程比较华丽，用到了几个数学上的概念：卷积，傅里叶级数。（注意还有另外一种CSM &amp;#8211; Cascaded Shadow Maps，两者作用是不一样的）&lt;/p&gt;&lt;p&gt;首先，假设&lt;strong&gt;x&lt;/strong&gt;&amp;#8838;&lt;strong&gt;R&lt;/strong&gt;&lt;sup&gt;&lt;font size="2"&gt;3&lt;/font&gt;&lt;/sup&gt;为某一点的世界坐标，d(&lt;strong&gt;x&lt;/strong&gt;)为该点到Light Source的距离（也就是Light Space的Depth）。&lt;strong&gt;p&lt;/strong&gt;&amp;#8838;&lt;strong&gt;R&lt;/strong&gt;&lt;sup&gt;&lt;font size="2"&gt;2&lt;/font&gt;&lt;/sup&gt;为该点对应到Shadow Map上的坐标，z(&lt;strong&gt;p&lt;/strong&gt;)为该点对应的Shadow Map上的Depth。于是可以定义一个Shadow Test函数：&lt;br /&gt;&lt;span class="formula"&gt;s(&lt;strong&gt;x&lt;/strong&gt;) = f(d(&lt;strong&gt;x&lt;/strong&gt;), z(&lt;strong&gt;p&lt;/strong&gt;))&lt;/span&gt; 当d&amp;gt;z时，s为0，反之为1&lt;br /&gt;为了得到软阴影，我们希望能对s进行卷积，即希望得到：&lt;br /&gt;&lt;span class="formula"&gt;s&lt;sub&gt;&lt;small&gt;&lt;font size="1"&gt;f&lt;/font&gt;&lt;/small&gt;&lt;/sub&gt;(&lt;strong&gt;x&lt;/strong&gt;) = &amp;#8721;w(&lt;strong&gt;q&lt;/strong&gt;)f(d(&lt;strong&gt;x&lt;/strong&gt;),z(&lt;strong&gt;p&lt;/strong&gt;-&lt;strong&gt;q&lt;/strong&gt;)) = [w*f(d(&lt;strong&gt;x&lt;/strong&gt;), z)](&lt;strong&gt;p&lt;/strong&gt;)&lt;/span&gt;（亮点1）&lt;br /&gt;如果能对上式运用卷积定理，得到如下式的结果，则表明可以通过对z(&lt;strong&gt;p&lt;/strong&gt;)做卷积而得到软阴影。（即可以利用Blur、硬件Bilinear Filter和Mipmap来达到软阴影）&lt;br /&gt;&lt;span class="formula"&gt;[w*f(d(&lt;strong&gt;x&lt;/strong&gt;), z)](&lt;strong&gt;p&lt;/strong&gt;) = f(d(&lt;strong&gt;x&lt;/strong&gt;), [w*z](&lt;strong&gt;p&lt;/strong&gt;))&lt;/span&gt;&lt;br /&gt;可惜的是，f(d(&lt;strong&gt;x&lt;/strong&gt;), z(&lt;strong&gt;p&lt;/strong&gt;))并不是线性函数（而是阶跃函数），无法对其运用卷积定理。为此，CSM转而采用数值分析方法，用傅立叶级数来逼近函数f。（亮点2）&lt;/p&gt;&lt;p&gt;虽然CSM的推导过程相当华丽，但是本身缺点太多（比如：内存开销较大，Shadow Map Pass需要输出的数据量太大，带宽内存都吃得太紧），导致其实用价值很低。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Exponential Shadow Maps&lt;/strong&gt;&lt;br /&gt;明白CSM的原理之后，ESM就显得相当简单了。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lancidie/aggbug/2341298.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lancidie/archive/2012/02/07/2341298.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lancidie/archive/2012/02/03/2337168.html</id><title type="text">一句话评论设计模式六大原则</title><summary type="text">原则，故名思议则是本质的意思。所谓擒贼先擒王，研究设计模式自然要先了解设计原则，所有的模式都是在这些原则的基础之上发展起来的，有的是侧重一个，有的是多个都有所涉及。看完设计模式之后，我感觉到每个模式都有这些原则的影子，还渗透着面向对象的三大属性，也觉得这些原则也都有相通之处，，正是有了他们才使我们由代码工人转为艺术家。下面我来点评一下六大原则，望各位拍砖： 1、单一职责原则（Single Responsibility Principle，简称SRP） 单一职责原则，就一个类而言，应该仅有一个引起它变化的原因。如果一个类承担的职责过多，就等于把这些职责耦合在一起，一个职责的变化可能会消弱或者..</summary><published>2012-02-03T07:28:00Z</published><updated>2012-02-03T07:28:00Z</updated><author><name>oayx</name><uri>http://www.cnblogs.com/lancidie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lancidie/archive/2012/02/03/2337168.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lancidie/archive/2012/02/03/2337168.html"/><content type="html">&lt;font size="4"&gt;原则，故名思议则是本质的意思。所谓擒贼先擒王，研究设计模式自然要先了解设计原则，所有的模式都是在这些原则的基础之上发展起来的，有的是侧重一个，有的是多个都有所涉及。看完设计模式之后，我感觉到每个模式都有这些原则的影子，还渗透着面向对象的三大属性，也觉得这些原则也都有相通之处，，正是有了他们才使我们由代码工人转为艺术家。下面我来点评一下六大原则，望各位拍砖：&lt;/font&gt; &lt;p&gt;&lt;span style="font-size: 18px"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size: 18px"&gt;&lt;strong&gt;1、单一职责原则（Single Responsibility Principle，简称SRP）&lt;/strong&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 单一职责原则，就一个类而言，应该仅有一个引起它变化的原因。如果一个类承担的职责过多，就等于把这些职责耦合在一起，一个职责的变化可能会消弱或者一直这个类完成其他职责的能力。这种耦合会导致脆弱的设计，当变化发生时，设计会遭受到意想不到的破坏。而软件设计真正要做的许多内容，就是发现职责，并把这些职责相互分离。&lt;br /&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="font-size: 18px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 一句话点评：高内聚低耦合的绝佳体现，不要乱拉关系，独善其身挺好。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18px"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size: 18px"&gt;&lt;strong&gt;2、 开放--封闭原则（The Open-Closed Principle,简称OCP）&lt;/strong&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;开放--封闭原则，是说软件实体（类、模块、函数等等）应该可以扩展，但是不可以修改。即对于扩展是开放的，对于更改是封闭的。 我们不可能做到未卜先知，在设计的时候尽可能让一个类足够好，设计好了就不要去修改了；不能完全封闭的情况下，当发生变化时，我们就创建抽象来隔离以后发生的同类变化。&lt;br /&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="font-size: 18px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 一句话点评：开放扩展，封闭更改，开合有度是一门艺术。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18px"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size: 18px"&gt;&lt;strong&gt;3、依赖倒转原则（Dependence Inversion Principle ）&lt;/strong&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 依赖倒转原则，指高层模块不应该依赖低层模块，两个都应该依赖抽象；抽象不应该依赖细节，细节应该依赖抽象。说白了就是要针对接口编程，不要对实现编程。举个例子：计算机硬件中，如果内存坏了，那么只需要换一个内存条就可以了，而不需要去换一个主板，在这里内存是一个接口类，只要符合他的规格要求就行，无论是那一根。&lt;br /&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="font-size: 18px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;一句话点评：搞建筑时要做设计师，而不是砖瓦工，抽象的蓝图要靠具体的材料一点点实现。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18px"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size: 18px"&gt;&lt;strong&gt;4、里氏代换原则（Liskov Substitution Principle，简称LSP）&lt;/strong&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;里氏代换原则，子类型必须能够替换掉他们的父类型。在软件里面，把父类都替换成其子类，程序的行为不会发生变化。正是由于子类型的可替换性才使得使用父类型的模块在无需修改的情况下就可以扩展。&lt;br /&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="font-size: 18px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;一句话点评：长辈给了你继承的权利就一定要做赡养的义务，把长辈的职责都要承担起来。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18px"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size: 18px"&gt;&lt;strong&gt;5、迪米特法则（&lt;span style="line-height: 24px; font-family: arial, 宋体, sans-serif; font-size: 15px"&gt;&lt;font face=""&gt;Law of Demeter&lt;/font&gt;&lt;/span&gt;）&lt;/strong&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="font-size: 18px"&gt;迪米特法则，&lt;/span&gt;如果两个类不必彼此直接通信，那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法时，可以通过第三者转发这个调用。类之间的耦合越弱，就越有利于复用，一个处在弱耦合的类被修改，不会对有关系的类造成波及。 主要是强调了类之间的松耦合。&lt;br /&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="font-size: 18px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;一句话点评：不要和陌生人说话，若两国交战要尽量避免正面冲突，多派使者协商调度。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18px"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size: 18px"&gt;&lt;strong&gt;6、合成/聚合复用原则（Composition/Aggregation Principle]，简称CARP）&lt;/strong&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;合成聚合复用原则，尽量使用合成/聚合，尽量不使用类继承。合成聚合是&amp;#8220;has &amp;nbsp;a&amp;#8221;的关系，而继承是&amp;#8220;is &amp;nbsp;a&amp;#8221;的关系。由于继承是一中强耦合的结构，父类变，子类必变。所以不是&amp;#8220;is&amp;nbsp; a&amp;#8221;关系，我们一般不要用继承。优先使用合成聚合复用原则，有助于保持每个类的封装，降低继承的层次。&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;一句话点评：优生优育，不要盲目繁衍。&lt;/span&gt;&lt;br /&gt;&lt;img src="http://www.cnblogs.com/lancidie/aggbug/2337168.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lancidie/archive/2012/02/03/2337168.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lancidie/archive/2012/01/29/2331242.html</id><title type="text">转：带新人的故事</title><summary type="text">转：带新人的故事打不死的小强 http://xiaoqiang.me/ 今年最大的收获就是带了新人，这是第一次完全把新人交给我，老大不做干预，让我自己来带。过程中经历了很多问题，做过很多sb的事情，也有了不少长进。下面把一些带人过程中的小故事分享一下，大部分都是失败的故事。故事1：我深知基础的执行对一个新人有多么的重要的，所以我会安排一大堆枯燥，耗时长，没什么成就感的基础工作让他做。其中有很多事情现在看来的确意义不大。一开始，他还愿意接受，但是这种事情多了，他的情绪就来了，明显表现出不情愿，不过我还是比较强硬的让他做。后来发现这些琐事严重影响到他的工作状态，我才罢手，砍掉了那些意义不大的工作.</summary><published>2012-01-29T08:23:00Z</published><updated>2012-01-29T08:23:00Z</updated><author><name>oayx</name><uri>http://www.cnblogs.com/lancidie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lancidie/archive/2012/01/29/2331242.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lancidie/archive/2012/01/29/2331242.html"/><content type="html">&lt;img src="http://bbs.gameres.com/image/posticon/icon1.gif"  alt="" /&gt; &lt;strong&gt;转：带新人的故事&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;打不死的小强 http://xiaoqiang.me/ &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;今年最大的收获就是带了新人，这是第一次完全把新人交给我，老大不做干预，让我自己来带。过程中经历了很多问题，做过很多sb的事情，也有了不少长进。下面把一些带人过程中的小故事分享一下，大部分都是失败的故事。&lt;br /&gt;&lt;br /&gt;故事1：&lt;br /&gt;&lt;br /&gt;我深知基础的执行对一个新人有多么的重要的，所以我会安排一大堆枯燥，耗时长，没什么成就感的基础工作让他做。其中有很多事情现在看来的确意义不大。一开始，他还愿意接受，但是这种事情多了，他的情绪就来了，明显表现出不情愿，不过我还是比较强硬的让他做。后来发现这些琐事严重影响到他的工作状态，我才罢手，砍掉了那些意义不大的工作内容&lt;br /&gt;&lt;br /&gt;总结：新人需要执行来锻炼，但是别像我一样这么折腾人。对新人的情绪影响很大&lt;br /&gt;&lt;br /&gt;故事2：&lt;br /&gt;&lt;br /&gt;我是一个急性子，十分看重效率。但是新人做事的时候不慌不忙，经常是一件事情没做完就搞其他东西。于是我很不爽，我们俩人在会议室里争论了半天，最终决定每次安排任务的时候给一个明确的完成时间，必须在完成时间之前搞定。他是按时完成了，但是完成的质量总是很难让我满意，于总是一遍一遍的返工。后来这个时间也被废了，我最终改为较宽松的时间+不错的质量。&lt;br /&gt;&lt;br /&gt;总结：大部分新人都有点胆小，不要给太大压力，压力大了就紧张，紧张就无法把事情做的漂亮&lt;br /&gt;&lt;br /&gt;故事3：&lt;br /&gt;&lt;br /&gt;他刚来的时候，我总觉得他做事情慢，总是说时间不够。所以我总问他这个事需要花你多少时间？（我的意思就是不用多少时间，你是太懒！）又一次他被我惹毛了，顶了我一句，我直接什么都没说就走了。过一会他意识到不对，找我到会议室谈谈，我们谈了很久，聊完之后豁然开朗，之前的不愉快瞬间烟消云散，而且我们之间也都更加理解对方了。&lt;br /&gt;&lt;br /&gt;总结：矛盾市场发生，平等的，有效的沟通总是能解决所有矛盾。千万别拿身份去压人，沟通必须是平等的！&lt;br /&gt;&lt;br /&gt;故事4&lt;br /&gt;&lt;br /&gt;我每次写完活动方案，都会给他看一下，让他来帮忙修改一下。一开始他也提不出什么建议，不过时间长了，他总能从玩家的角度发现一些问题，提一些好的建议，甚至是一些不错活动的想法。慢慢的，一沟通起活动，他就有点来劲。在不到一年时间里，他已经能够完全自主的做活动的方案和执行了。并且效果很不错。&lt;br /&gt;&lt;br /&gt;总结：让新人参与的决策的制定中，不要把他们当外人一样看待，虽然一开始他只能听，但是时间长了，他就会把每一件事当做自己的事情。参与并且负责人。&lt;br /&gt;&lt;br /&gt;故事5&lt;br /&gt;&lt;br /&gt;【小背景】我最不喜欢做的事情就是解释，把自己干的破事归咎到其他原因，摆脱责任，实在没什么意思。所以我当小弟的时候很少解释，改正，下次做好就行。&lt;br /&gt;&lt;br /&gt;前一篇文章说过，一开始我安排过很多工作给他，有一部分的确不够合理，可能是他感觉到这些工作没什么意义，也可能是他懒，慢慢的，这些工作就做的越来越少，最后不再做了。这个过程中我没有认错，没有解释为什么可&lt;span style="display: none; font-size: 0px"&gt;[来源：GameRes.com]&lt;/span&gt;以不做了。&lt;br /&gt;&lt;br /&gt;因为我的不解释，他可能觉得其他工作也是可以偷懒的，于是其他工作也开始慢慢的缩水或者不做。一开始，我会唠叨他，让他做，但是时间长了，我唠叨烦了，效果也小了，于是就不再唠叨了。只要结果（KPI）符合预期，手段相对合理，我就没有再强烈要求他做过什么，最多就是建议和一些方式上的探讨。&lt;br /&gt;&lt;br /&gt;总结：小弟不用给老大解释什么，但是老大要给小弟解释很多东西，让他们明白什么事情需要做，为什么，有什么好处，什么坏处。老大不能太沉默，老大沉默了就变成了不负责，不知道，可以钻空子。&lt;br /&gt;&lt;br /&gt;故事6&lt;br /&gt;&lt;br /&gt;他来一阵之后，团队的结构有变动，完全把一款产品交给我们2人来做，我们拥有绝对的决策权。而之前产品比较低迷，于是我想了很多办法，并制定了一条主线。然后我俩开始执行。&lt;br /&gt;&lt;br /&gt;这个阶段，我很有热情，立志要把产品拖出低谷。我发现热情是可以传染的，那个阶段，他的工作效率和工作质量也比较高。但是之后我的热情褪去，他的热情也淡了，很多事情在执行上并没有达到我的标准，虽然结果（KPI）不错。&lt;br /&gt;&lt;br /&gt;总结：想要下面的人有激情，自己先要有激情，把你的激情传染给别人，其过程和结果都会让人惊喜！&lt;/p&gt;&lt;p&gt;未完待续&amp;#8230;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lancidie/aggbug/2331242.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lancidie/archive/2012/01/29/2331242.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lancidie/archive/2012/01/29/2331237.html</id><title type="text">提需求时需要关注的3大要点</title><summary type="text">提需求是运营人员经常干的事情，最近提需求时候很纠结，但是环境所迫，又没法说，只能在这里谈谈自己对需求的看法。我认为提需求时，最重要的因素有3点：风险，成本，替代品风险风险是首要考虑的因素，如果连这一关都没过，后面就不用再浪费时间了。风险主要有2大来源：第一是需求操作过程的风险，例如有些需求需要动较敏感的数据库，有些需求执行过程中可能造成宕机…另一类是需求做好后对游戏生态的影响，例如新需求的属性过于颠覆游戏本身的内容，或者新需求做好后很快有新版本，而新版本的内容跟需求内容造成冲突。发觉风险时直接砍掉需求或者调整需求。成本提需求的成本主要分为2大部分：需求沟通成本，需求开发成本沟通成本就是运营提出</summary><published>2012-01-29T08:16:00Z</published><updated>2012-01-29T08:16:00Z</updated><author><name>oayx</name><uri>http://www.cnblogs.com/lancidie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lancidie/archive/2012/01/29/2331237.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lancidie/archive/2012/01/29/2331237.html"/><content type="html">提需求是运营人员经常干的事情，最近提需求时候很纠结，但是环境所迫，又没法说，只能在这里谈谈自己对需求的看法。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;我认为提需求时，最重要的因素有3点：风险，成本，替代品&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;img border="0" src="http://upload.gameres.com/20121/sf_1813149_6550.jpg"  ;  alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;风险&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;风险是首要考虑的因素，如果连这一关都没过，后面就不用再浪费时间了。&lt;br /&gt;&lt;br /&gt;风险主要有2大来源：&lt;br /&gt;&lt;br /&gt;第一是需求操作过程的风险，例如有些需求需要动较敏感的数据库，有些需求执行过程中可能造成宕机&amp;#8230;&lt;br /&gt;&lt;br /&gt;另一类是需求做好后对游戏生态的影响，例如新需求的属性过于颠覆游戏本身的内容，或者新需求做好后很快有新版本，而新版本的内容跟需求内容造成冲突。&lt;br /&gt;&lt;br /&gt;发觉风险时直接砍掉需求或者调整需求。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;成本&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;提需求的成本主要分为2大部分：需求沟通成本，需求开发成本&lt;br /&gt;&lt;br /&gt;沟通成本就是运营提出需求后，跟技术（策划）一起沟通，哪些要做，哪些不做，哪些需要调整的过程。&lt;br /&gt;&lt;br /&gt;常规的需求，开发成本就2条：人力成本（谁做），时间成本（做多久）。操作的复杂程度不在成本的考虑范围内，可以归结为时间成本。&lt;br /&gt;&lt;br /&gt;如果开发成本比较高，花一些时间在沟通上是有价值的。如果开发成本很低且无风险，却花了很多时间用来确定沟通要不要做，那就是浪费时间。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;替代品&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;所有需求的出发点都是目的，为了实现目的，我们想到了一种手段，这个手段在实现上需要一些道具或者逻辑来支持，才有了需求。&lt;br /&gt;&lt;br /&gt;&lt;img border="0" src="http://upload.gameres.com/20121/sf_18131456_5867.jpg"  ;  alt="" /&gt;&lt;br /&gt;&lt;br /&gt;实现一个目的的手段有很多，实现一个手段的方式有时候也可以灵活。当有风险了，当成本高了，我们不必吊死在一棵树上，想想其他办法，总能得到一个大家都开心的结局，如果在一个需求上死磕，开发被你整烦了，未来的日子会及其不好过。&lt;br /&gt;&lt;br /&gt;所以，当沟通过程中遇到了困难，就退一步，找一些替代品，肯定会海阔天空。&lt;br /&gt;&lt;img src="http://www.cnblogs.com/lancidie/aggbug/2331237.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lancidie/archive/2012/01/29/2331237.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lancidie/archive/2012/01/29/2330937.html</id><title type="text">Windows线程同步API</title><summary type="text">本文主要总结创建、结束线程和WIN32 API提供的一些线程同步方法。同步方法包括用户态同步方式：InterLock、CriticalSection、SRWLock和内核态同步方式：Event、Semaphore、Mutex等。本文通过简单的例子演示API的使用，没有包含原理的说明，假定读者具有其他语言或者平台的并发编程经验。创建、结束线程WIN32 API虽然提供了CreateThead和ExitThread方法，但是在C++中，永远不应该使用这两个方法创建或结束线程。而应该使用VC++提供的_beginthread、_beginthreadex方法，相应的结束线程方法_endthread、</summary><published>2012-01-29T02:56:00Z</published><updated>2012-01-29T02:56:00Z</updated><author><name>oayx</name><uri>http://www.cnblogs.com/lancidie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lancidie/archive/2012/01/29/2330937.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lancidie/archive/2012/01/29/2330937.html"/><content type="html">&lt;div id="cnblogs_post_body"&gt;&lt;p&gt;本文主要总结创建、结束线程和WIN32 API提供的一些线程同步方法。同步方法包括用户态同步方式：InterLock、CriticalSection、SRWLock和内核态同步方式：Event、Semaphore、Mutex等。本文通过简单的例子演示API的使用，没有包含原理的说明，假定读者具有其他语言或者平台的并发编程经验。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;创建、结束线程&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;WIN32 API虽然提供了CreateThead和ExitThread方法，但是在C++中，永远不应该使用这两个方法创建或结束线程。而应该使用VC++提供的_beginthread、_beginthreadex方法，相应的结束线程方法_endthread、_endthreadex。后者除了在内部调用CreateThread或ExitThread方法外，还负责CRT的初始化或销毁。虽然有直接结束线程的方法，但在C++最好通过线程方法正常返回来结束线程。直接结束线程时C++对象的析构函数不会被调用。&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:9023d0a8-8ad9-4214-ac82-d14f98eedd7d" class="wlWriterEditableSmartContent"&gt;&lt;div&gt;&lt;div id="highlighter_714280" class="syntaxhighlighter  cpp ie  "&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;a class="toolbar_item command_help help" href="http://www.cnblogs.com/devj/archive/2011/10/25/2223856.html#"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;8&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;9&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;10&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;11&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;12&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;13&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;14&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;15&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;16&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;17&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;18&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;19&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;20&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;21&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;22&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;23&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;24&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;25&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;26&lt;/div&gt;&lt;div class="line number27 index26 alt2"&gt;27&lt;/div&gt;&lt;div class="line number28 index27 alt1"&gt;28&lt;/div&gt;&lt;div class="line number29 index28 alt2"&gt;29&lt;/div&gt;&lt;div class="line number30 index29 alt1"&gt;30&lt;/div&gt;&lt;div class="line number31 index30 alt2"&gt;31&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="cpp preprocessor"&gt;&lt;font color="#808080"&gt;#include "stdafx.h" &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;namespace&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;std; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;Obj &lt;/code&gt;&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;: &lt;/code&gt;&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;Obj() { cout &amp;lt;&amp;lt; &lt;/code&gt;&lt;code class="cpp string"&gt;&lt;font color="#0000ff"&gt;"Obj() called"&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;&amp;lt;&amp;lt; endl; } &lt;/code&gt;&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;~Obj() { cout &amp;lt;&amp;lt; &lt;/code&gt;&lt;code class="cpp string"&gt;&lt;font color="#0000ff"&gt;"~Obj() called"&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;&amp;lt;&amp;lt; endl; } &lt;/code&gt;&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;&lt;code class="cpp plain"&gt;}; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;&lt;code class="cpp plain"&gt;unsigned &lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;WINAPI ThreadFunc(&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;* pvParam){ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;cout &amp;lt;&amp;lt; &lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;static_cast&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;&amp;lt;&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;char&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;*&amp;gt;(pvParam) &amp;lt;&amp;lt; endl; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;Obj obj; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;_endthreadex(2); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;1; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;_tmain(&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;argc, _TCHAR* argv[]) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;unsigned &lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;threadId; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;char&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;*param = &lt;/code&gt;&lt;code class="cpp string"&gt;&lt;font color="#0000ff"&gt;"param"&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;thread&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;= (&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;)_beginthreadex(NULL, 0, ThreadFunc, param, 0, &amp;amp;threadId); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;Sleep(100); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;DWORD&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;exitCode; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number27 index26 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;GetExitCodeThread(&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;thread&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;, &amp;amp;exitCode); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number28 index27 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;cout &amp;lt;&amp;lt; &lt;/code&gt;&lt;code class="cpp string"&gt;&lt;font color="#0000ff"&gt;"ExitCode:"&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;&amp;lt;&amp;lt; exitCode &amp;lt;&amp;lt; endl; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number29 index28 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp functions bold"&gt;&lt;strong&gt;&lt;font color="#ff1493"&gt;system&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;(&lt;/code&gt;&lt;code class="cpp string"&gt;&lt;font color="#0000ff"&gt;"pause"&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number30 index29 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;0; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number31 index30 alt2"&gt;&lt;code class="cpp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这段代码的输出为：&lt;/p&gt;&lt;p&gt;&lt;em&gt;param&lt;br /&gt;Obj() called&lt;br /&gt;ExitCode:2&lt;br /&gt;请按任意键继续. . .&lt;/em&gt;&lt;/p&gt;&lt;p&gt;_beginthreadex的第一个参数为SECURITY_ATTRIBUTES结构指针，可以指定NULL使用默认的安全配置。第二参数为cbStackSize，线程栈大小；设置为0使用默认值，可以通过链接参数&lt;em&gt;/STACK:[reserve][,commit]&lt;/em&gt;控制。第三个参数为线程入口方法地址，方法签名如ThreadFunc所示。第四个三处为传递给入口方法的参数（值传递），具体意义由程序自己解释。最后一个参数是返回的线程ID。返回值为新创建线程的句柄。__endthreadex方法唯一的参数指定线程的ExitCode。可以通过GetExitCodeThread方法获得线程退出码。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;InterLocked系列原子方法&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;InterLocked系列方法可视为原子的。完成其功能时，保证其他线程不会访问同一个资源。例如最简单的InterLockedIncrement方法原子自增一个共享变量。&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:34199472-27db-4832-9f42-d91ef57c2834" class="wlWriterEditableSmartContent"&gt;&lt;div&gt;&lt;div id="highlighter_322451" class="syntaxhighlighter  cpp ie"&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;a class="toolbar_item command_help help" href="http://www.cnblogs.com/devj/archive/2011/10/25/2223856.html#"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;8&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;9&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;10&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;11&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;12&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;13&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;14&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;15&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;16&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;17&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;18&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;19&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;20&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;21&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;long&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;g_sum(0); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="cpp plain"&gt;unsigned &lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;WINAPI ThreadFunc(&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;* pvParam){ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;for&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;(&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;i = 0; i &amp;lt; 100000; ++i) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;InterlockedIncrement(&amp;amp;g_sum); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;0; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;_tmain(&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;argc, _TCHAR* argv[]) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;unsigned &lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;threadId; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;thread1 = (&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;)_beginthreadex(NULL, 0, ThreadFunc, NULL, 0, &amp;amp;threadId); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;thread2 = (&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;)_beginthreadex(NULL, 0, ThreadFunc, NULL, 0, &amp;amp;threadId); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;Sleep(1000); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;cout &amp;lt;&amp;lt; &lt;/code&gt;&lt;code class="cpp string"&gt;&lt;font color="#0000ff"&gt;"Sum:"&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;&amp;lt;&amp;lt; g_sum &amp;lt;&amp;lt; endl; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp functions bold"&gt;&lt;strong&gt;&lt;font color="#ff1493"&gt;system&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;(&lt;/code&gt;&lt;code class="cpp string"&gt;&lt;font color="#0000ff"&gt;"pause"&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;0; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;&lt;code class="cpp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;其他方法包括：&lt;/p&gt;&lt;p&gt;InterlockedIncrement64：自增一个64位整数。&lt;/p&gt;&lt;p&gt;InterlockedExchangeAdd、InterlockedExchangeAdd64：加和两个数并赋值给第一个值。&lt;/p&gt;&lt;p&gt;InterlockedCompareExchange：比较并交换一个数。&lt;/p&gt;&lt;p&gt;还有很多InterLocked方法，具体参考MSDN文档。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;CriticalSection&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;通过EnterCriticalSection和LeaveCriticalSection方法，可以控制同步一段代码的访问。使用前需要使用InitializeCriticalSection初始化CRITICAL_SECTION。使用方法也很简单。&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:13793c12-fffb-4ebd-8c94-4aa8cb82727f" class="wlWriterEditableSmartContent"&gt;&lt;div&gt;&lt;div id="highlighter_165134" class="syntaxhighlighter  cpp ie  "&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;a class="toolbar_item command_help help" href="http://www.cnblogs.com/devj/archive/2011/10/25/2223856.html#"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;8&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;9&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;10&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;11&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;12&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;13&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;14&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;15&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;16&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;17&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;18&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;19&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;20&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;21&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;22&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;23&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;24&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;25&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;26&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="cpp plain"&gt;CRITICAL_SECTION g_cs; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;long&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;g_sum(0); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="cpp plain"&gt;unsigned &lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;WINAPI ThreadFunc(&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;* pvParam){ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;for&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;(&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;i = 0; i &amp;lt; 100000; ++i) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;EnterCriticalSection(&amp;amp;g_cs); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;g_sum += 2; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;LeaveCriticalSection(&amp;amp;g_cs); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;0; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;_tmain(&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;argc, _TCHAR* argv[]) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;InitializeCriticalSection(&amp;amp;g_cs); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;unsigned &lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;threadId; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;thread1 = (&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;)_beginthreadex(NULL, 0, ThreadFunc, NULL, 0, &amp;amp;threadId); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;thread2 = (&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;)_beginthreadex(NULL, 0, ThreadFunc, NULL, 0, &amp;amp;threadId); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;Sleep(1000); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;cout &amp;lt;&amp;lt; &lt;/code&gt;&lt;code class="cpp string"&gt;&lt;font color="#0000ff"&gt;"Sum:"&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;&amp;lt;&amp;lt; g_sum &amp;lt;&amp;lt; endl; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;DeleteCriticalSection(&amp;amp;g_cs); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp functions bold"&gt;&lt;strong&gt;&lt;font color="#ff1493"&gt;system&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;(&lt;/code&gt;&lt;code class="cpp string"&gt;&lt;font color="#0000ff"&gt;"pause"&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;0; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;&lt;code class="cpp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这里有一个问题是，如果同步的代码块不是简单g_sum += 2，而是可能抛出异常的复杂代码。就需要确保LeaveCriticalSection一定被调用。不再使用后使用DeleteCriticalSection方法删除之。&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:0a9d1450-2b13-4baa-bb29-dc7ee1e81935" class="wlWriterEditableSmartContent"&gt;&lt;div&gt;&lt;div id="highlighter_552976" class="syntaxhighlighter  cpp ie "&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;a class="toolbar_item command_help help" href="http://www.cnblogs.com/devj/archive/2011/10/25/2223856.html#"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;8&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;9&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;10&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;11&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;12&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;13&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;14&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;15&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;16&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;17&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;18&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;19&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;20&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;21&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;22&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;CSManager &lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;: &lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;CSManager(CRITICAL_SECTION *cs) : m_cs(cs) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;EnterCriticalSection(m_cs); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;~CSManager() &lt;/code&gt;&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;LeaveCriticalSection(m_cs); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;private&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;: &lt;/code&gt;&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;CRITICAL_SECTION *m_cs; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;&lt;code class="cpp plain"&gt;}; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;&lt;code class="cpp comments"&gt;&lt;font color="#008200"&gt;//... &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;for&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;(&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;i = 0; i &amp;lt; 100000; ++i) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;CSManager CSMgr(&amp;amp;g_cs); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;g_sum += 2; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;&lt;code class="cpp comments"&gt;&lt;font color="#008200"&gt;//...&lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;CSManager在构造函数中调用EnterCriticalSection，析构函数中调用LeaveCriticalSection。保证在代码块结束时调用Leave方法。&lt;/p&gt;&lt;p&gt;另外除了使用阻塞的Enter方法，还有一个&lt;strong&gt;TryEnterCriticalSection&lt;/strong&gt;，该方法尝试进去CriticalSetion，如果失败，不会阻塞，而是立即返回FALSE。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;SRWLOCK&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;SRWLOCK具有和CriticalSection类似的功能。另外还具有读写锁分离的分离的功能。可以使用AcquireSRWLockShared获取共享的读锁。使用AcquireSRWLockExclusive获取独占的写锁。使用对应的ReleaseSRWLockShared/Exclusive方法施放锁。同样地，使用前需要使用InitializeSRWLock初始化。&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:0e0aef5e-9a28-4c9d-871c-2d35b0c93425" class="wlWriterEditableSmartContent"&gt;&lt;div&gt;&lt;div id="highlighter_55782" class="syntaxhighlighter  cpp ie "&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;a class="toolbar_item command_help help" href="http://www.cnblogs.com/devj/archive/2011/10/25/2223856.html#"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;8&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;9&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;10&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;11&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;12&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;13&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;14&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;15&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;16&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;17&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;18&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;19&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;20&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;21&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;22&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;23&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;24&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;25&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;26&lt;/div&gt;&lt;div class="line number27 index26 alt2"&gt;27&lt;/div&gt;&lt;div class="line number28 index27 alt1"&gt;28&lt;/div&gt;&lt;div class="line number29 index28 alt2"&gt;29&lt;/div&gt;&lt;div class="line number30 index29 alt1"&gt;30&lt;/div&gt;&lt;div class="line number31 index30 alt2"&gt;31&lt;/div&gt;&lt;div class="line number32 index31 alt1"&gt;32&lt;/div&gt;&lt;div class="line number33 index32 alt2"&gt;33&lt;/div&gt;&lt;div class="line number34 index33 alt1"&gt;34&lt;/div&gt;&lt;div class="line number35 index34 alt2"&gt;35&lt;/div&gt;&lt;div class="line number36 index35 alt1"&gt;36&lt;/div&gt;&lt;div class="line number37 index36 alt2"&gt;37&lt;/div&gt;&lt;div class="line number38 index37 alt1"&gt;38&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="cpp plain"&gt;SRWLOCK g_lock; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;long&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;g_sum(0); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="cpp plain"&gt;unsigned &lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;WINAPI ReadThreadFunc(&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;* pvParam){ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;for&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;(&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;i = 0; i &amp;lt; 10; ++i) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;AcquireSRWLockShared(&amp;amp;g_lock); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;cout &amp;lt;&amp;lt; g_sum &amp;lt;&amp;lt; endl; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;ReleaseSRWLockShared(&amp;amp;g_lock); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;Sleep(1); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;0; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;&lt;code class="cpp plain"&gt;unsigned &lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;WINAPI WriteThreadFunc(&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;* pvParam){ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;for&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;(&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;i = 0; i &amp;lt; 100000; ++i) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;AcquireSRWLockExclusive(&amp;amp;g_lock); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;g_sum += 2; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;ReleaseSRWLockExclusive(&amp;amp;g_lock); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;0; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;_tmain(&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;argc, _TCHAR* argv[]) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number27 index26 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;InitializeSRWLock(&amp;amp;g_lock); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number28 index27 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number29 index28 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;unsigned &lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;threadId; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number30 index29 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;thread1 = (&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;)_beginthreadex(NULL, 0, ReadThreadFunc, NULL, 0, &amp;amp;threadId); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number31 index30 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;thread2 = (&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;)_beginthreadex(NULL, 0, ReadThreadFunc, NULL, 0, &amp;amp;threadId); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number32 index31 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;thread3 = (&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;)_beginthreadex(NULL, 0, WriteThreadFunc, NULL, 0, &amp;amp;threadId); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number33 index32 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number34 index33 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;Sleep(1000); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number35 index34 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;cout &amp;lt;&amp;lt; &lt;/code&gt;&lt;code class="cpp string"&gt;&lt;font color="#0000ff"&gt;"Sum:"&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;&amp;lt;&amp;lt; g_sum &amp;lt;&amp;lt; endl; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number36 index35 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp functions bold"&gt;&lt;strong&gt;&lt;font color="#ff1493"&gt;system&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;(&lt;/code&gt;&lt;code class="cpp string"&gt;&lt;font color="#0000ff"&gt;"pause"&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number37 index36 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;0; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number38 index37 alt1"&gt;&lt;code class="cpp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;SRWLOCK不具备类似于TryEnterCriticalSection的非阻塞方法。大多数情况下，SRWLOCK比CRITICAL_SECTION有更好的性能。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Condition Variable&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;为实现近点的生产者消费者问题。我们可以使用两个CONDITION_VARIABLE：g_full，g_empty来实现。在缓冲区满的时候，生产者线程调用SleepConditionVariableSRW(&amp;amp;g_full, &amp;amp;g_lock, INFINITE, 0)施放获得的锁并等待g_full。缓冲区空的时候，消费者可以调用leepConditionVariableSRW(&amp;amp;g_empty, &amp;amp;g_lock, INFINITE, 0)施放获得的锁并等待g_empty。掉进满足后，可是使用WakeAllConditionVariable唤醒所有等待的线程或者使用WakeConditionVariable唤醒一个等待的线程。&lt;/p&gt;&lt;p&gt;和Condition Variable配置使用的可以使CrticalSection也可以使SRWLock。&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:3f372183-98b3-4f36-80d0-1aba67e5a711" class="wlWriterEditableSmartContent"&gt;&lt;div&gt;&lt;div id="highlighter_396481" class="syntaxhighlighter  cpp ie"&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;a class="toolbar_item command_help help" href="http://www.cnblogs.com/devj/archive/2011/10/25/2223856.html#"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;8&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;9&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;10&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;BOOL&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;SleepConditionVariableCS( &lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;PCONDITION_VARIABLE pConditionVariable, &lt;/code&gt;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;PCRITICAL_SECTION pCriticalSection, &lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;DWORD&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;dwMilliseconds); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;BOOL&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;SleepConditionVariableSRW( &lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;PCONDITION_VARIABLE pConditionVariable, &lt;/code&gt;&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;PSRWLOCK pSRWLock, &lt;/code&gt;&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;DWORD&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;dwMilliseconds, &lt;/code&gt;&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;ULONG&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;Flags);&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;参数dwMilliseconds指定等待超时的时间，如果超时方法返回FASLE；INFINITE指定等待不超时。参数Flags指定被唤醒时尝试获得的锁的类型。CONDITION_VARIABLE_LOCKMODE_ SHARED指定获得共享锁或者0指定获得独占锁。&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:700faae1-f11e-482d-9235-8f5321dde6d6" class="wlWriterEditableSmartContent"&gt;&lt;div&gt;&lt;div id="highlighter_801053" class="syntaxhighlighter  cpp ie"&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;a class="toolbar_item command_help help" href="http://www.cnblogs.com/devj/archive/2011/10/25/2223856.html#"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;8&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;9&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;10&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;11&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;12&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;13&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;14&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;15&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;16&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;17&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;18&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;19&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;20&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;21&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;22&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;23&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;24&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;25&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;26&lt;/div&gt;&lt;div class="line number27 index26 alt2"&gt;27&lt;/div&gt;&lt;div class="line number28 index27 alt1"&gt;28&lt;/div&gt;&lt;div class="line number29 index28 alt2"&gt;29&lt;/div&gt;&lt;div class="line number30 index29 alt1"&gt;30&lt;/div&gt;&lt;div class="line number31 index30 alt2"&gt;31&lt;/div&gt;&lt;div class="line number32 index31 alt1"&gt;32&lt;/div&gt;&lt;div class="line number33 index32 alt2"&gt;33&lt;/div&gt;&lt;div class="line number34 index33 alt1"&gt;34&lt;/div&gt;&lt;div class="line number35 index34 alt2"&gt;35&lt;/div&gt;&lt;div class="line number36 index35 alt1"&gt;36&lt;/div&gt;&lt;div class="line number37 index36 alt2"&gt;37&lt;/div&gt;&lt;div class="line number38 index37 alt1"&gt;38&lt;/div&gt;&lt;div class="line number39 index38 alt2"&gt;39&lt;/div&gt;&lt;div class="line number40 index39 alt1"&gt;40&lt;/div&gt;&lt;div class="line number41 index40 alt2"&gt;41&lt;/div&gt;&lt;div class="line number42 index41 alt1"&gt;42&lt;/div&gt;&lt;div class="line number43 index42 alt2"&gt;43&lt;/div&gt;&lt;div class="line number44 index43 alt1"&gt;44&lt;/div&gt;&lt;div class="line number45 index44 alt2"&gt;45&lt;/div&gt;&lt;div class="line number46 index45 alt1"&gt;46&lt;/div&gt;&lt;div class="line number47 index46 alt2"&gt;47&lt;/div&gt;&lt;div class="line number48 index47 alt1"&gt;48&lt;/div&gt;&lt;div class="line number49 index48 alt2"&gt;49&lt;/div&gt;&lt;div class="line number50 index49 alt1"&gt;50&lt;/div&gt;&lt;div class="line number51 index50 alt2"&gt;51&lt;/div&gt;&lt;div class="line number52 index51 alt1"&gt;52&lt;/div&gt;&lt;div class="line number53 index52 alt2"&gt;53&lt;/div&gt;&lt;div class="line number54 index53 alt1"&gt;54&lt;/div&gt;&lt;div class="line number55 index54 alt2"&gt;55&lt;/div&gt;&lt;div class="line number56 index55 alt1"&gt;56&lt;/div&gt;&lt;div class="line number57 index56 alt2"&gt;57&lt;/div&gt;&lt;div class="line number58 index57 alt1"&gt;58&lt;/div&gt;&lt;div class="line number59 index58 alt2"&gt;59&lt;/div&gt;&lt;div class="line number60 index59 alt1"&gt;60&lt;/div&gt;&lt;div class="line number61 index60 alt2"&gt;61&lt;/div&gt;&lt;div class="line number62 index61 alt1"&gt;62&lt;/div&gt;&lt;div class="line number63 index62 alt2"&gt;63&lt;/div&gt;&lt;div class="line number64 index63 alt1"&gt;64&lt;/div&gt;&lt;div class="line number65 index64 alt2"&gt;65&lt;/div&gt;&lt;div class="line number66 index65 alt1"&gt;66&lt;/div&gt;&lt;div class="line number67 index66 alt2"&gt;67&lt;/div&gt;&lt;div class="line number68 index67 alt1"&gt;68&lt;/div&gt;&lt;div class="line number69 index68 alt2"&gt;69&lt;/div&gt;&lt;div class="line number70 index69 alt1"&gt;70&lt;/div&gt;&lt;div class="line number71 index70 alt2"&gt;71&lt;/div&gt;&lt;div class="line number72 index71 alt1"&gt;72&lt;/div&gt;&lt;div class="line number73 index72 alt2"&gt;73&lt;/div&gt;&lt;div class="line number74 index73 alt1"&gt;74&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;const&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;MAX_SIZE = 10; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="cpp plain"&gt;CONDITION_VARIABLE g_full; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="cpp plain"&gt;CONDITION_VARIABLE g_empty; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&lt;code class="cpp plain"&gt;SRWLOCK g_lock; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;&lt;code class="cpp plain"&gt;list&amp;lt;Product&amp;gt; products; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;&lt;code class="cpp plain"&gt;unsigned &lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;WINAPI ProduceThreadFunc(&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;* pvParam) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;i(0); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;while&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;(&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;true&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;Sleep(&lt;/code&gt;&lt;code class="cpp functions bold"&gt;&lt;strong&gt;&lt;font color="#ff1493"&gt;rand&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;() % 100); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;AcquireSRWLockExclusive(&amp;amp;g_lock); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;(products.size() &amp;gt;= MAX_SIZE) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;SleepConditionVariableSRW(&amp;amp;g_full, &amp;amp;g_lock, INFINITE, 0); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;else&lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;cout &amp;lt;&amp;lt; &lt;/code&gt;&lt;code class="cpp string"&gt;&lt;font color="#0000ff"&gt;"Produce Product:"&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;&amp;lt;&amp;lt; i &amp;lt;&amp;lt; &lt;/code&gt;&lt;code class="cpp string"&gt;&lt;font color="#0000ff"&gt;" by thread "&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;&amp;lt;&amp;lt; GetThreadId(GetCurrentThread()) &amp;lt;&amp;lt; endl; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;products.push_back(Product(i++)); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number27 index26 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;WakeAllConditionVariable(&amp;amp;g_empty); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number28 index27 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;ReleaseSRWLockExclusive(&amp;amp;g_lock); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number29 index28 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number30 index29 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number31 index30 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;0; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number32 index31 alt1"&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number33 index32 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number34 index33 alt1"&gt;&lt;code class="cpp plain"&gt;unsigned &lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;WINAPI ConsumeThreadFunc(&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;* pvParam) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number35 index34 alt2"&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number36 index35 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;while&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;(&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;true&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number37 index36 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number38 index37 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;Sleep(&lt;/code&gt;&lt;code class="cpp functions bold"&gt;&lt;strong&gt;&lt;font color="#ff1493"&gt;rand&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;() % 100); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number39 index38 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number40 index39 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;AcquireSRWLockExclusive(&amp;amp;g_lock); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number41 index40 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;(products.size() == 0) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number42 index41 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number43 index42 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;SleepConditionVariableSRW(&amp;amp;g_empty, &amp;amp;g_lock, INFINITE, 0); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number44 index43 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number45 index44 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;else&lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number46 index45 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number47 index46 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;Product p = products.front(); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number48 index47 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;products.pop_front(); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number49 index48 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;cout &amp;lt;&amp;lt; &lt;/code&gt;&lt;code class="cpp string"&gt;&lt;font color="#0000ff"&gt;"Consume Product:"&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;&amp;lt;&amp;lt; p.m_no &amp;lt;&amp;lt; &lt;/code&gt;&lt;code class="cpp string"&gt;&lt;font color="#0000ff"&gt;" by thread "&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;&amp;lt;&amp;lt; GetThreadId(GetCurrentThread()) &amp;lt;&amp;lt; endl; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number50 index49 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number51 index50 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number52 index51 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;WakeAllConditionVariable(&amp;amp;g_full); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number53 index52 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;ReleaseSRWLockExclusive(&amp;amp;g_lock); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number54 index53 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number55 index54 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number56 index55 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number57 index56 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;0; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number58 index57 alt1"&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number59 index58 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number60 index59 alt1"&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;_tmain(&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;argc, _TCHAR* argv[]) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number61 index60 alt2"&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number62 index61 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp functions bold"&gt;&lt;strong&gt;&lt;font color="#ff1493"&gt;srand&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;((unsigned)&lt;/code&gt;&lt;code class="cpp functions bold"&gt;&lt;strong&gt;&lt;font color="#ff1493"&gt;time&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;(NULL)); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number63 index62 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;InitializeSRWLock(&amp;amp;g_lock); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number64 index63 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;unsigned &lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;threadId; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number65 index64 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;thread1 = (&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;)_beginthreadex(NULL, 0, ProduceThreadFunc, NULL, 0, &amp;amp;threadId); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number66 index65 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;thread2 = (&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;)_beginthreadex(NULL, 0, ConsumeThreadFunc, NULL, 0, &amp;amp;threadId); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number67 index66 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;thread3 = (&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;)_beginthreadex(NULL, 0, ConsumeThreadFunc, NULL, 0, &amp;amp;threadId); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number68 index67 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number69 index68 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;WaitForSingleObject(thread1, INFINITE); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number70 index69 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;WaitForSingleObject(thread2, INFINITE); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number71 index70 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;WaitForSingleObject(thread3, INFINITE); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number72 index71 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp functions bold"&gt;&lt;strong&gt;&lt;font color="#ff1493"&gt;system&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;(&lt;/code&gt;&lt;code class="cpp string"&gt;&lt;font color="#0000ff"&gt;"pause"&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number73 index72 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;0; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number74 index73 alt1"&gt;&lt;code class="cpp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;内核态线程同步方法&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;除了上面介绍的用户态的线程同步方法。本文继续通过几个简单例子演示内核态的线程同步方法的使用。内核态线程同步方法在性能上肯定比用户态同步方法要差很多。但可以在多个进程间共享。&lt;/p&gt;&lt;p&gt;创建所有的内核态同步对象都范围一个内核对象句柄HANDLE。通过WaitForSingleObject或者WaitForMultipleObjects等待内核同步对象转换为已传信状态（signaled）。如果等待的是线程或者进程对象，那么对应线程或进程结束后即转换为已传信状态。同时还可以指定一个超时时间。WaitForSingleObject包括WAIT_OBJECT_0，WAIT_TIMEOUT和WAIT_FAILED。不再使用后调用CloseHandle释放引用。&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:31e9e8ec-61c1-44f5-a2a8-64c4ce1ba6c9" class="wlWriterEditableSmartContent"&gt;&lt;div&gt;&lt;div id="highlighter_911037" class="syntaxhighlighter  cpp ie"&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;a class="toolbar_item command_help help" href="http://www.cnblogs.com/devj/archive/2011/10/25/2223856.html#"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;8&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;9&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;10&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;11&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;12&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;DWORD&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;dw = WaitForSingleObject(hProcess, 5000); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;switch&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;(dw) { &lt;/code&gt;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;case&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;WAIT_OBJECT_0: &lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp comments"&gt;&lt;font color="#008200"&gt;// The process terminated. &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;break&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;case&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;WAIT_TIMEOUT: &lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp comments"&gt;&lt;font color="#008200"&gt;// The process did not terminate within 5000 milliseconds. &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;break&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;case&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;WAIT_FAILED: &lt;/code&gt;&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp comments"&gt;&lt;font color="#008200"&gt;// Bad call to function (invalid handle?) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;break&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;&lt;code class="cpp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;WaitForMultipleObjects如果指定参数bWaitAll为TRUE，则等待所有对象都转换为已传信状态后才返回，如果为指定bWaitAll为FALSE，则任意对象转换为已传信状态即返回。可以通过以下方法来判断是那个内核同步对象。&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:dac2eff3-62e8-4f55-98f0-2265cd6c38bb" class="wlWriterEditableSmartContent"&gt;&lt;div&gt;&lt;div id="highlighter_589183" class="syntaxhighlighter  cpp ie"&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;a class="toolbar_item command_help help" href="http://www.cnblogs.com/devj/archive/2011/10/25/2223856.html#"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;8&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;9&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;10&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;11&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;12&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;13&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;14&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;15&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;16&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;17&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;18&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;19&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;20&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;21&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;22&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;23&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;24&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;25&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="cpp plain"&gt;h[0] = hProcess1; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="cpp plain"&gt;h[1] = hProcess2; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="cpp plain"&gt;h[2] = hProcess3; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;DWORD&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;dw = WaitForMultipleObjects(3, h, FALSE, 5000); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;switch&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;(dw) { &lt;/code&gt;&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;case&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;WAIT_FAILED: &lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp comments"&gt;&lt;font color="#008200"&gt;// Bad call to function (invalid handle?) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;break&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;case&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;WAIT_TIMEOUT: &lt;/code&gt;&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp comments"&gt;&lt;font color="#008200"&gt;// None of the objects became signaled within 5000 milliseconds. &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;break&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;case&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;WAIT_OBJECT_0 + 0: &lt;/code&gt;&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp comments"&gt;&lt;font color="#008200"&gt;// The process identified by h[0] (hProcess1) terminated. &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;break&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;case&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;WAIT_OBJECT_0 + 1: &lt;/code&gt;&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp comments"&gt;&lt;font color="#008200"&gt;// The process identified by h[1] (hProcess2) terminated. &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;break&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;case&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;WAIT_OBJECT_0 + 2: &lt;/code&gt;&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp comments"&gt;&lt;font color="#008200"&gt;// The process identified by h[2] (hProcess3) terminated. &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;break&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;&lt;code class="cpp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Event&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Event语义上可以理解为一个事件是否发生。SetEvent方法设置Event为Signaled状态。Event有两种类型。第一种是自动重置的事件，调用SetEvent方法后，唤醒一个等待的线程后即自动转换为未传信状态。第二种是手动重置事件，调用SetEvent方法后，需要调用ResetEvent方法设置事件为未传信状态。PulseEvent相当于调用SetEvent后立即调用ResetEvent。对于手动重置时间，PulseEvent会唤醒所有等待的线程。而对于自动重置的事件PulseEvent只会唤醒一个等待的线程。&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:8e88b30e-f0d8-4434-a22b-400f63d1e6b8" class="wlWriterEditableSmartContent"&gt;&lt;div&gt;&lt;div id="highlighter_842426" class="syntaxhighlighter  cpp ie"&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;a class="toolbar_item command_help help" href="http://www.cnblogs.com/devj/archive/2011/10/25/2223856.html#"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;8&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;9&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;10&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;11&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;12&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;13&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;14&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;15&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;16&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;17&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;18&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;19&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;20&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;21&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;22&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;23&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;24&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;25&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;26&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;g_taskEvent; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="cpp plain"&gt;unsigned &lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;WINAPI ComputationTask(&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;* pvParam) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;WaitForSingleObject(g_taskEvent, INFINITE); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;for&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;(&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;i = 0; i &amp;lt; 10; ++i) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;cout &amp;lt;&amp;lt; &lt;/code&gt;&lt;code class="cpp string"&gt;&lt;font color="#0000ff"&gt;"comput "&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;&amp;lt;&amp;lt; i &amp;lt;&amp;lt; endl; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;0; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;_tmain(&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;argc, _TCHAR* argv[]) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;g_taskEvent = CreateEvent(NULL, FALSE, FALSE, NULL); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;unsigned &lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;threadId; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;thread1 = (&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;)_beginthreadex(NULL, 0, ComputationTask, NULL, 0, &amp;amp;threadId); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp functions bold"&gt;&lt;strong&gt;&lt;font color="#ff1493"&gt;system&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;(&lt;/code&gt;&lt;code class="cpp string"&gt;&lt;font color="#0000ff"&gt;"pause"&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;SetEvent(g_taskEvent); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;ResetEvent(g_taskEvent); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;WaitForSingleObject(thread1, INFINITE); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp functions bold"&gt;&lt;strong&gt;&lt;font color="#ff1493"&gt;system&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;(&lt;/code&gt;&lt;code class="cpp string"&gt;&lt;font color="#0000ff"&gt;"pause"&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;0; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;&lt;code class="cpp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;上面是一个简单的例子，ComputationTask线程等待用户输入后才开始计算任务。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Semaphore&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Semaphore维护一个资源计数count和一个最大计数maxCount。&lt;/p&gt;&lt;p&gt;当count大于0时，semaphore处于已传信状态。&lt;/p&gt;&lt;p&gt;当count等于0是，semaphore处于未传信状态。&lt;/p&gt;&lt;p&gt;通过ReleaseSemaphore增加count计数，WaitForSingleObject减少cout计数。count不会小于0，也不能大于maxCount。&lt;/p&gt;&lt;p&gt;例如，可以使用semaphore控制能够同时处理的最大任务线程数。当有超过最大数的更多任务线程开启时只能等待其他任务完成并调用ReleaseSemaphore方法施放资源引用计数。&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:6270a9c2-be22-4859-a7cd-c01541409e00" class="wlWriterEditableSmartContent"&gt;&lt;div&gt;&lt;div id="highlighter_404916" class="syntaxhighlighter  cpp ie"&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;a class="toolbar_item command_help help" href="http://www.cnblogs.com/devj/archive/2011/10/25/2223856.html#"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;8&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;9&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;10&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;11&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;12&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;13&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;14&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;15&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;16&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;17&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;18&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;19&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;20&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;21&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;22&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;23&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;24&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;25&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;26&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;g_semaphore; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="cpp plain"&gt;unsigned &lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;WINAPI RequstProcesor(&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;* pvParam) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;WaitForSingleObject(g_semaphore, INFINITE); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;cout &amp;lt;&amp;lt; &lt;/code&gt;&lt;code class="cpp string"&gt;&lt;font color="#0000ff"&gt;"Start process request "&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;&amp;lt;&amp;lt; GetThreadId(GetCurrentThread()) &amp;lt;&amp;lt; endl; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;Sleep(1000); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;ReleaseSemaphore(g_semaphore, 1, NULL); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;0; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;_tmain(&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;argc, _TCHAR* argv[]) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;g_semaphore = CreateSemaphore(NULL, 2, 2, NULL); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;threads[10]; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;for&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;(&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;i = 0; i &amp;lt; 10; i++) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;threads[i] = (&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;)_beginthreadex(NULL, 0, RequstProcesor, NULL, 0, NULL); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;WaitForMultipleObjects(10, threads, TRUE, INFINITE); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp functions bold"&gt;&lt;strong&gt;&lt;font color="#ff1493"&gt;system&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;(&lt;/code&gt;&lt;code class="cpp string"&gt;&lt;font color="#0000ff"&gt;"pause"&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;0; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;&lt;code class="cpp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;上面的代码，启动了10个线程，但只能有2个现场可以同时执行，更多的线程只能等待。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Mutex&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;mutex的功能和CriticalSection功能很相似。都是控制一段临界代码的互斥访问。通过WaitForSingleObject等待mutex。ReleaseMutex释放mutex。&lt;/p&gt;&lt;p&gt;mutex维护一个threadId和一个使用计数count。如果CreateMutex的参数bInitialOwner为TRUE，这threadId为调用线程，cout为1。否则都初始为0。&lt;/p&gt;&lt;p&gt;如果threadId为0，mutex没有被任何线程使用，处于已传信状态。如果threadId不为0，mutex处于未传信状态。mutex和其他内核同步对象一个不同的特殊地方在于。即时mutex处于未传信状态。如果调用WaitForSingleObject的线程是mutex的threadId对应的线程，WaitForSingleObject不会阻塞相当于处于已传信状态。下面的例子演示了mutex的使用。&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:0d26ffc4-41b0-4065-82ee-6d0be76300bc" class="wlWriterEditableSmartContent"&gt;&lt;div&gt;&lt;div id="highlighter_110238" class="syntaxhighlighter  cpp ie"&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;a class="toolbar_item command_help help" href="http://www.cnblogs.com/devj/archive/2011/10/25/2223856.html#"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;8&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;9&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;10&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;11&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;12&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;13&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;14&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;15&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;16&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;17&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;18&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;19&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;20&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;21&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;22&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;23&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;24&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;25&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;26&lt;/div&gt;&lt;div class="line number27 index26 alt2"&gt;27&lt;/div&gt;&lt;div class="line number28 index27 alt1"&gt;28&lt;/div&gt;&lt;div class="line number29 index28 alt2"&gt;29&lt;/div&gt;&lt;div class="line number30 index29 alt1"&gt;30&lt;/div&gt;&lt;div class="line number31 index30 alt2"&gt;31&lt;/div&gt;&lt;div class="line number32 index31 alt1"&gt;32&lt;/div&gt;&lt;div class="line number33 index32 alt2"&gt;33&lt;/div&gt;&lt;div class="line number34 index33 alt1"&gt;34&lt;/div&gt;&lt;div class="line number35 index34 alt2"&gt;35&lt;/div&gt;&lt;div class="line number36 index35 alt1"&gt;36&lt;/div&gt;&lt;div class="line number37 index36 alt2"&gt;37&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;g_mutex; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;ProcessA() &lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;WaitForSingleObject(g_mutex, INFINITE); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;cout &amp;lt;&amp;lt; &lt;/code&gt;&lt;code class="cpp string"&gt;&lt;font color="#0000ff"&gt;"ProcessA"&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;&amp;lt;&amp;lt; &lt;/code&gt;&lt;code class="cpp string"&gt;&lt;font color="#0000ff"&gt;" by thread "&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;&amp;lt;&amp;lt; GetThreadId(GetCurrentThread()) &amp;lt;&amp;lt; endl; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;ReleaseMutex(g_mutex); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;ProcessB() &lt;/code&gt;&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;WaitForSingleObject(g_mutex, INFINITE); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;ProcessA(); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;cout &amp;lt;&amp;lt; &lt;/code&gt;&lt;code class="cpp string"&gt;&lt;font color="#0000ff"&gt;"ProcessB"&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;&amp;lt;&amp;lt; &lt;/code&gt;&lt;code class="cpp string"&gt;&lt;font color="#0000ff"&gt;" by thread "&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;&amp;lt;&amp;lt; GetThreadId(GetCurrentThread()) &amp;lt;&amp;lt; endl; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;ReleaseMutex(g_mutex); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;&lt;code class="cpp plain"&gt;unsigned &lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;WINAPI ThreadFunc(&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;* pvParam) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;ProcessB(); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;0; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;_tmain(&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;argc, _TCHAR* argv[]) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;g_mutex = CreateMutex(NULL, FALSE, NULL); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number27 index26 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number28 index27 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;threads[10]; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number29 index28 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;for&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;(&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;int&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;i = 0; i &amp;lt; 10; i++) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number30 index29 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number31 index30 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;threads[i] = (&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;&lt;strong&gt;&lt;font color="#808080"&gt;HANDLE&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;)_beginthreadex(NULL, 0, ThreadFunc, NULL, 0, NULL); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number32 index31 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number33 index32 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number34 index33 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;WaitForMultipleObjects(10, threads, TRUE, INFINITE); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number35 index34 alt2"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp functions bold"&gt;&lt;strong&gt;&lt;font color="#ff1493"&gt;system&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;(&lt;/code&gt;&lt;code class="cpp string"&gt;&lt;font color="#0000ff"&gt;"pause"&lt;/font&gt;&lt;/code&gt;&lt;code class="cpp plain"&gt;); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number36 index35 alt1"&gt;&lt;code class="cpp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/code&gt; &lt;code class="cpp plain"&gt;0; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number37 index36 alt2"&gt;&lt;code class="cpp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/lancidie/aggbug/2330937.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lancidie/archive/2012/01/29/2330937.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lancidie/archive/2012/01/29/2330853.html</id><title type="text">_beginthreadex</title><summary type="text">//创建和结束线程.cpp:Definestheentrypointfortheconsoleapplication.//#include"stdafx.h"#include&lt;iostream&gt;#include&lt;Windows.h&gt;#include&lt;process.h&gt;classObj{public:Obj(){std::cout&lt;&lt;"Obj::Obj()"&lt;&lt;std::endl;}~Obj(){std::cout&lt;&lt;"Obj::~Obj()"&lt;&lt;st</summary><published>2012-01-29T02:04:00Z</published><updated>2012-01-29T02:04:00Z</updated><author><name>oayx</name><uri>http://www.cnblogs.com/lancidie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lancidie/archive/2012/01/29/2330853.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lancidie/archive/2012/01/29/2330853.html"/><content type="html">&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;创建和结束线程.cpp&amp;nbsp;:&amp;nbsp;Defines&amp;nbsp;the&amp;nbsp;entry&amp;nbsp;point&amp;nbsp;for&amp;nbsp;the&amp;nbsp;console&amp;nbsp;application.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;#include&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;stdafx.h&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;br /&gt;#include&amp;nbsp;&amp;lt;iostream&amp;gt;&lt;br /&gt;#include&amp;nbsp;&amp;lt;Windows.h&amp;gt;&lt;br /&gt;#include&amp;nbsp;&amp;lt;process.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&amp;nbsp;Obj&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Obj()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;std::cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Obj::Obj()&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;std::endl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;~Obj()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;std::cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Obj::~Obj()&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;std::endl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;unsigned&amp;nbsp;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;WINAPI&amp;nbsp;ThreadProc(&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;*para)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;std::cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ThreadProc:&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;static_cast&amp;lt;&lt;span style="color: #0000ff"&gt;char&lt;/span&gt;*&amp;gt;(para)&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;std::endl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Obj&amp;nbsp;obj;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;如果注释，则会调用析构函数&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;::_endthreadex(2);&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080"&gt;1&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;_tmain(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;argc,&amp;nbsp;_TCHAR*&amp;nbsp;argv[])&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;/*&lt;/span&gt;&lt;span style="color: #008000"&gt;WIN32&amp;nbsp;API虽然提供了CreateThead和ExitThread方法，但是在C++中，永远不应该使用这两个方法创建或结束线程。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;而应该使用VC++提供的_beginthread、_beginthreadex方法，相应的结束线程方法_endthread、_endthreadex。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;后者除了在内部调用CreateThread或ExitThread方法外，还负责CRT的初始化或销毁。虽然有直接结束线程的方法，&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;但在C++最好通过线程方法正常返回来结束线程。直接结束线程时C++对象的析构函数不会被调用。&lt;/span&gt;&lt;span style="color: #008000"&gt;*/&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned&amp;nbsp;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;nThreadID;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;char&lt;/span&gt;&amp;nbsp;*param&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;param&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HANDLE&amp;nbsp;kThread&amp;nbsp;=&amp;nbsp;(HANDLE)::_beginthreadex(NULL,&amp;nbsp;&lt;span style="color: #800080"&gt;0&lt;/span&gt;,&amp;nbsp;ThreadProc,&amp;nbsp;param,&amp;nbsp;&lt;span style="color: #800080"&gt;0&lt;/span&gt;,&amp;nbsp;&amp;amp;nThreadID);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Sleep(&lt;span style="color: #800080"&gt;100&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;nExitCode;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;::GetExitCodeThread(kThread,&amp;nbsp;&amp;amp;nExitCode);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;std::cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Exit&amp;nbsp;code:&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;nExitCode&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;std::endl;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;getchar();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/lancidie/aggbug/2330853.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lancidie/archive/2012/01/29/2330853.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lancidie/archive/2012/01/20/2328050.html</id><title type="text">暗黑破坏神3测试服版本更新 游戏系统大改</title><summary type="text">还在BETA测试中的《暗黑破坏神3》再度进行了更新，而本次更新后游戏的各项系统进行了较大的改动，为此《暗黑破坏神3》的游戏设计总监Jay Wilson在官网发布了相关说明，下面让我们一起来看看暗黑3测试服中进行了哪些改动。 以下说明来自暴雪官方公告： 系统改动 - Jay Wilson 在制作《暗黑破坏神III》的过程中，一直有人说我们过于纠结于系统方面的细节因而浪费了太多时间：“这个游戏已经做得够好了，快出吧！”这说法可以理解，但我不觉得它是对的。我们的工作并不仅仅是推出一款游戏，更多是在推出《暗黑破坏神》系列的一个续作。人们不会去记住一款游戏是否推迟了，只有一款伟大的游戏才会让人记...</summary><published>2012-01-20T09:25:00Z</published><updated>2012-01-20T09:25:00Z</updated><author><name>oayx</name><uri>http://www.cnblogs.com/lancidie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lancidie/archive/2012/01/20/2328050.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lancidie/archive/2012/01/20/2328050.html"/><content type="html">还在BETA测试中的《暗黑破坏神3》再度进行了更新，而本次更新后游戏的各项系统进行了较大的改动，为此《暗黑破坏神3》的游戏设计总监Jay Wilson在官网发布了相关说明，下面让我们一起来看看暗黑3测试服中进行了哪些改动。 &lt;div class="img_wrapper"&gt;&lt;a href="http://games.sina.com.cn/o/i/2012-01-20/0955237387.shtml" target="_blank"&gt;&lt;img title="暗黑破坏神3" alt="暗黑破坏神3" src="http://i0.sinaimg.cn/gm/2012/0120/U5253P115DT20120120095509.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;以下说明来自暴雪官方公告：&lt;/p&gt;&lt;p&gt;系统改动 - Jay Wilson&lt;/p&gt;&lt;p&gt;在制作《暗黑破坏神III》的过程中，一直有人说我们过于纠结于系统方面的细节因而浪费了太多时间：&amp;#8220;这个游戏已经做得够好了，快出吧！&amp;#8221;这说法可以理解，但我不觉得它是对的。我们的工作并不仅仅是推出一款游戏，更多是在推出《暗黑破坏神》系列的一个续作。人们不会去记住一款游戏是否推迟了，只有一款伟大的游戏才会让人记住你。我们相信自己可以为广大玩家提供这样一款游戏，但目前我们还没完成到这一步。这款游戏到现在都还没发售，我们也还没有公布任何发售日期，原因很简单：我们还没做好。在进一步完善和雕琢游戏内容的同时，我们也在继续对游戏的核心系统进行一些反复。因此我希望在这里向大家提供一份我们目前正在摆弄的系统的更新列表。&lt;/p&gt;&lt;p&gt;我们目前正在进行的那些改动源自内部和外部测试者的反馈，内容包括物品打造、物品、核心属性和物品栏等等。在这里我们会把这些改动大致地列举一遍，并解释它们背后的原因。除此之外，我们还在对符文和技能系统进行一些大规模的改动，但目前还不是公布的时机。我能保证的是在技能和符文系统完成以前我们不可能发布这款游戏。&lt;/p&gt;&lt;p&gt;先从小地方开始 &amp;#8211; &lt;span style="color: #3366ff"&gt;鉴定卷轴从游戏里消失了&lt;/span&gt;。未鉴定的的物品以及鉴定物品的操作依然是游戏的一个重要组成部分，但现在获得一个未鉴定的物品以后，你只要右键点击它，就会出现一条代表正在检验的短暂施法条，检验完成以后，该物品就会变成已鉴定的状态。找到一件礼物然后拆开它能给人带来双重惊喜，我们很喜欢这种方式，但这不代表你需要随身带着几把剪刀。从现在开始你将可以自行鉴定所有的物品，不需要携带卷轴。因为你在《暗黑破坏神III》里的角色从来就是这样酷。&lt;/p&gt;&lt;p&gt;然后是一处更小但更显著的改动 &amp;#8211; &lt;span style="color: #3366ff"&gt;第五个快捷栏位移动了位置，并成为了一个药水专属按钮&lt;/span&gt;。在整个游戏的开发过程中，我们在是否加入专门的药水按钮的问题上反复了好几次。而最近，我们明显感到有必要让玩家能在危急情况下第一时间想起他们的药水。目前我们的战斗模型并不鼓励(甚至根本就不允许)用药水流来打怪，但它们在你一路运气不好没打出生命之球或是陷入了自己应付不了的状况时会非常有用。这项改动是最新加入的，因此在封测补丁10中还不存在专门的药水按钮。但这确实是我们的改动方向，你会在今后的封测更新中看到相关支持。&lt;/p&gt;&lt;p&gt;以上是一部分简单改动。目前我们设计组的目标是重新审视所有的系统，并清除相互间的重叠冗余的部分，必要时还会移除一些无可救药的组件。出于这些理由和一些更崇高的目的，&lt;span style="color: #3366ff"&gt;我们将删除密士这一NPC&lt;/span&gt;。在研究了整个物品自定义系统以后，我们发现物品强化(即密士的作用)对整个游戏没有任何助益。强化系统和插槽+宝石系统没有任何区别，只是换了个名字。除非我们想继续拖延游戏的发售时间，让这一系统回到绘图板上，然后从头设计过，否则目前最合理的方案是把这些东西暂且延后，今后再去重新讨论密士和强化系统。删除密士自然也要花一点时间，但和重新设计一套物品自定义系统要花的功夫相比就微不足道了。我们希望将来有一天她能重返你的除魔旅团，但眼下我们还是要把注意力放到游戏中已有的那些重点的自定义选项中。&lt;/p&gt;&lt;p&gt;《暗黑破坏神III》已经开发了很长一段时间，其间我们也一直在研究整个系统，并审视以前基于当时的状况所作出的那些决定到了现在是否还说得通。比如我们最近加入了召回之石。它只需要一个很短的施法时间就能让你回到城里。但更早的时候我们曾说过我们不会加入城镇传送门(因为很多玩家会利用它们来在战斗中投机取巧)&amp;#8212;&amp;#8212;这一点在目前仍然站得住脚，但同时我们也发现这个游戏依然需要一个快速旅行的方式，虽然我们增加了传送点的数量但其自由度仍然及不上城镇传送门，而现在，我们可以使用召回之石来解决所有这些问题。然而正因为召回之石的引入，我们又需要回头重新评估先前那些因为城镇传送门的消失而引入的补偿机制。&lt;span style="color: #3366ff"&gt;经过了谨慎的评估以后，我们决定移除乔丹金炉和奈非天魔方。&lt;/span&gt;当初加入它们是为了让玩家可以在无法快速回城情况下就地分解和出售物品。但现在有了召回之石，我们再让这些东西继续存在只会减少玩家本该得到的收益，如出售、分解、制造物品，与镇民交流、管理物品栏等等，这些设施都是非常有用的，可以让玩家暂时脱离紧张的战斗，在回归战场之前能有时间评估自己身上的装备并使用制造功能。另外，我们决定不再自欺欺人，干脆就把召回之石的名字改为了城镇传送门，并将这一它直接嵌入到了界面上的技能栏中。&lt;/p&gt;&lt;div class="img_wrapper"&gt;&lt;a href="http://games.sina.com.cn/o/i/2012-01-20/0950237384.shtml" target="_blank"&gt;&lt;img title="暗黑破坏神3" alt="暗黑破坏神3" src="http://i3.sinaimg.cn/gm/2012/0120/U5253P115DT20120120094028.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="color: #3366ff"&gt;分解物品的工作现在由铁匠负责。&lt;/span&gt;魔方被移除以后，我们当然就得在城镇中增设一个用于分解物品的设施，而由铁匠来当然这项工作是很合理也很符合逻辑的。&lt;/p&gt;&lt;div class="img_wrapper"&gt;&lt;a href="http://games.sina.com.cn/o/i/2012-01-20/0950237385.shtml" target="_blank"&gt;&lt;img title="铁匠" alt="铁匠" src="http://i1.sinaimg.cn/gm/2012/0120/U5253P115DT20120120094112.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="color: #3366ff"&gt;另一项重大改动是普通(白色)物品无法再被分解。&lt;/span&gt;我们发现原设定会导致一些物品方面的问题，但最主要的原因还是物品重要性这块上的方针变化。以前我们的想法是一个物品一旦掉落后，必须要能发挥一些作用，要不就是给你提升属性，要不就是白色物品可以被分解后重组成更好的物品。通过大量的游戏测试，我们回归了《黑暗破坏神II》的掉落方式：即让怪物掉落大量的不值得拾取的垃圾。虽然《暗黑破坏神II》会掉落大量的垃圾，大部分是箭支和弩箭，但在遇到好的装备时，这更会助长玩家&amp;#8220;捡到宝&amp;#8221;的喜悦，当然我们同样很喜欢物品掉一地的感觉。因此我们就需要重新平衡物品本身的价值和我们扔给玩家的物品数量之间的比重。&lt;/p&gt;&lt;p&gt;由此，我们进行了另一项改动，同时这也是今天我要详细讲解的最后一项改动：&lt;/p&gt;&lt;p&gt;&lt;span style="color: #3366ff"&gt;我们将角色的核心属性改为力量、敏捷、智力和活力，&lt;/span&gt;而每项属性所提供的增益则被划分为：&lt;/p&gt;&lt;p&gt;力量&lt;/p&gt;&lt;p&gt;+野蛮人伤害&lt;/p&gt;&lt;p&gt;+护甲&lt;/p&gt;&lt;p&gt;敏捷&lt;/p&gt;&lt;p&gt;+猎魔人伤害&lt;/p&gt;&lt;p&gt;+武僧伤害&lt;/p&gt;&lt;p&gt;+闪避&lt;/p&gt;&lt;p&gt;智力&lt;/p&gt;&lt;p&gt;+魔法师伤害&lt;/p&gt;&lt;p&gt;+巫医伤害&lt;/p&gt;&lt;p&gt;+生命之球补充的生命值&lt;/p&gt;&lt;p&gt;活力&lt;/p&gt;&lt;p&gt;+生命值&lt;/p&gt;&lt;p&gt;我们取消了防御、攻击、和精准这些属性，新的护甲属性将取代原有的防御属性。我们还将加入+物理抗性来取代原有的护甲，并用+暴击几率来取代精准。很显然，这些角色属性方面的改动只是我们的另一项更巨大的改动的冰山一角，因为它要求我们对物品属性和游戏平衡进行广泛而深入的再设定。&lt;/p&gt;&lt;p&gt;这些改动背后的原因之一是为了让各种属性变得更直观，但更重要的原因是解决我们目前遇到的一些物品系统的方面的问题。正如我刚才说的，我们想把物品系统改回到一大堆垃圾物品的模式，但除此之外，我们还需要加入各种各样奇葩的物品，让人看一眼就知道不适合你的角色。我们希望掉落大量的物品，并加强玩家拾取到极品时的兴奋感，因此我们就需要各种属性分配不合理的物品(对你的角色来说或是抛开特定角色来说)。通过给每个职业指定主属性，我们可以降低物品的重复性，令我们的物品库变得更多样化，并最终创造一种更明确的物品属性系统，并在你的角色发现超酷的新物品时提供足够的兴奋感。&lt;/p&gt;&lt;p&gt;总体而言， 这些改动对你想追求的物品的影响非常小。你以后需要的物品依然还是你以前需要的那些。对物品的取舍依然取决第二属性和物品名称上的词缀，而我们正尽可能地将更多词缀加入游戏(我们以前也一直在这样做)，以确保物品的多样性。单纯加入一些能强化特定技能的词缀就已经能对物品库作出极大的拓展，并创造出更多的可能性。&lt;/p&gt;&lt;p&gt;继续，在移除了乔丹金炉和奈非天魔方，并将城镇传送门移到技能面板以后，&lt;span style="color: #3366ff"&gt;我们现在直接把角色属性整合到了物品栏界面中。&lt;/span&gt;这给玩家观察不同装备对自身属性的影响提供了极大的便利。新界面将和旧有的界面提供同样详细的信息，并能提高界面的效率令其变得更加有用。虽然看起来是很小的一个改动，但产生了让我们非常满意的结果。&lt;/p&gt;&lt;div class="img_wrapper"&gt;&lt;a href="http://games.sina.com.cn/o/i/2012-01-20/0951237386.shtml" target="_blank"&gt;&lt;img title="暗黑3变动" alt="暗黑3变动" src="http://i0.sinaimg.cn/gm/2012/0120/U5253P115DT20120120094533.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;我们将在最新的封测补丁中加入以上所有的改动，因此我们希望有封测资格的玩家能多多尝试它们，并到我们的封测反馈论坛上来发表你的想法。&lt;/p&gt;&lt;p&gt;当然，目前我们仍有许多工作要做，我们正一如既往地对平衡性改动作出调整，这是一项非常艰巨的任务。你们可以在封测中看到一部分：如物品稀有度的改动、我们在各个等级的区域中加入的物品词缀数量以及它们的加入方式、敌方怪物的词缀数量等等。当然，还有一部分改动是你在封测中看不到的，例如对整个游戏(包括四种不同难度)的平衡、后期的各种新词缀、传说级别的物品、新的物品打造配方和物品设计图、成就以及战网的各种新功能。正如我上面提到的，我们同时还在对其余系统进行更大的改动&amp;#8212;&amp;#8212;尤其是技能和符文方面。虽然目前还不是公布的时机，但我们希望能在将来呈现给大家。&lt;/p&gt;&lt;p&gt;我们暴雪娱乐的所有员工都希望《暗黑破坏神III》能在发布的第一天就成为最佳的游戏。为了达到这一目的，我们还将继续对我们已有的设计进行反复，改变我们花了大量时间构思和设定的那些系统，或是删除早已融入游戏核心体验的那些系统。我们希望在反复的重构过程中，不断地对我们以前作出过的决策提出质疑。《暗黑破坏神III》不止要在发售时达到我们的预期，更要在之后的十年二十年里继续维持暴雪的精品要求。&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: KaiTi_GB2312"&gt;Jay Wilson是《暗黑破坏神III》的游戏设计总监，&amp;#8220;神秘的肉&amp;#8221;的发明者，他认为凯特&amp;#183;贝金赛尔 是史上最伟大的女演员。&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;a href="http://games.sina.com.cn/zt/2012endday/index.shtml" target="_blank"&gt;&lt;img title="就算世界末日，也不能阻挡我们玩游戏！ " alt="就算世界末日，也不能阻挡我们玩游戏！" src="http://i3.sinaimg.cn/gm/2012/0119/zw140.jpg" /&gt;&lt;/a&gt;&lt;a href="http://games.sina.com.cn/zt/2012endday/index.shtml" target="_blank"&gt;&lt;span class="img_descr"&gt;就算世界末日，也不能阻挡我们玩游戏！&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/lancidie/aggbug/2328050.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lancidie/archive/2012/01/20/2328050.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lancidie/archive/2012/01/20/2327968.html</id><title type="text">周末轻松话卷积(上)</title><summary type="text">最近总是和卷积打交道,工作需要，每天都要碰到它好几次,不胜烦恼,因为在大学时候学信号与系统的时候就没学会，我于是心想一定要把卷积完全搞明白。正好同办公室的同学也问我什么是卷积,师姐昨天也告诉我说:“我也早就想把这个问题搞明白了！”经过一段时间的思考之后，有一些很有趣的体会和大家分享。听说卷积这种运算式物理学家发明的，在实际中用得不亦乐乎，而数学家却一直没有把运算的意义彻底搞明白。仔细品以下，还是有那么点滋味的。下面先看一下剑桥大学的教科书对卷积的定义：我们都知道这个公式，但是它有什么物理意义呢，平时我们用卷积做过很多事情，信号处理时，输出函数是输入函数和系统函数的卷积，在图像处理时，两组幅分辨</summary><published>2012-01-20T07:51:00Z</published><updated>2012-01-20T07:51:00Z</updated><author><name>oayx</name><uri>http://www.cnblogs.com/lancidie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lancidie/archive/2012/01/20/2327968.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lancidie/archive/2012/01/20/2327968.html"/><content type="html">&lt;p&gt;&lt;font size="4"&gt;最近总是和卷积打交道,工作需要，每天都要碰到它好几次,不胜烦恼,因为在大学时候学信号与系统的时候就没学会，我于是心想一定要把卷积完全搞明白。正好同办公室的同学也问我什么是卷积,师姐昨天也告诉我说:&amp;#8220;我也早就想把这个问题搞明白了！&amp;#8221;经过一段时间的思考之后，有一些很有趣的体会和大家分享。&lt;br /&gt;&lt;br /&gt;听说卷积这种运算式物理学家发明的，在实际中用得不亦乐乎，而数学家却一直没有把运算的意义彻底搞明白。仔细品以下，还是有那么点滋味的。&lt;br /&gt;&lt;br /&gt;下面先看一下剑桥大学的教科书对卷积的定义：&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://blog.sciencenet.cn/upload/blog/images/2009/11/20091128222953553.jpg"&gt;&lt;img alt="" src="http://blog.sciencenet.cn/upload/blog/images/2009/11/20091128222953553.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4" face="楷体_GB2312"&gt;我们都知道这个公式，但是它有什么物理意义呢，平时我们用卷积做过很多事情，信号处理时，输出函数是输入函数和系统函数的卷积，在图像处理时，两组幅分辨率不同的图卷积之后得到的互相平滑的图像可以方便处理。卷积甚至可以用在考试作弊中，为了让照片同时像两个人，只要把两人的图像卷积处理即可，这就是一种平滑的过程，可是我们怎么才能真正把公式和实际建立起一种联系呢，也就是说，我们能不能从生活中找到一种很方便且具体的例子来表达公式的物理意义呢？我想到一种，下面进入正题：&lt;br /&gt;比如说你的老板命令你干活，你却到楼下打台球去了，后来被老板发现，他非常气愤，扇了你一巴掌（注意，这就是输入信号，脉冲），于是你的脸上会渐渐地（贱贱地）鼓起来一个包，你的脸就是一个系统，而鼓起来的包就是你的脸对巴掌的响应，好，这样就和信号系统建立起来意义对应的联系。下面还需要一些假设来保证论证的严谨：假定你的脸是线性时不变系统，也就是说，无论什么时候老板打你一巴掌，打在你脸的同一位置（这似乎要求你的脸足够光滑，如果你说你长了很多青春痘，甚至整个脸皮处处连续处处不可导，那难度太大了，我就无话可说了哈哈），你的脸上总是会在相同的时间间隔内鼓起来一个相同高度的包来，并且假定以鼓起来的包的大小作为系统输出。好了，那么，下面可以进入核心内容&amp;#8212;&amp;#8212;卷积了！&lt;br /&gt;如果你每天都到地下去打台球，那么老板每天都要扇你一巴掌，不过当老板打你一巴掌后，你5分钟就消肿了，所以时间长了，你甚至就适应这种生活了&amp;#8230;&amp;#8230;如果有一天，老板忍无可忍，以0.5秒的间隔开始不间断的扇你的过程，这样问题就来了，第一次扇你鼓起来的包还没消肿，第二个巴掌就来了，你脸上的包就可能鼓起来两倍高，老板不断扇你，脉冲不断作用在你脸上，效果不断叠加了，这样这些效果就可以求和了，结果就是你脸上的包的高度岁时间变化的一个函数了（注意理解）；如果老板再狠一点，频率越来越高，以至于你都辨别不清时间间隔了，那么，求和就变成积分了。可以这样理解，在这个过程中的某一固定的时刻，你的脸上的包的鼓起程度和什么有关呢？和之前每次打你都有关！但是各次的贡献是不一样的，越早打的巴掌，贡献越小，所以这就是说，某一时刻的输出是之前很多次输入乘以各自的衰减系数之后的叠加而形成某一点的输出，然后再把不同时刻的输出点放在一起，形成一个函数，这就是卷积，卷积之后的函数就是你脸上的包的大小随时间变化的函数。本来你的包几分钟就可以消肿，可是如果连续打，几个小时也消不了肿了，这难道不是一种平滑过程么？反映到剑桥大学的公式上，f(a)就是第a个巴掌，g(x-a)就是第a个巴掌在x时刻的作用程度，乘起来再叠加就ok了，大家说是不是这个道理呢？我想这个例子已经非常形象了，你对卷积有了更加具体深刻的了解了吗？&lt;br /&gt;最近要忙开题了，不过周末了还是放松一下吧。其实我真的希望我的朋友们看到这篇文章能给我留言，发表你们的想法，有不妥之处欢迎提出来。&lt;/font&gt;&lt;font size="4" face="楷体_GB2312"&gt;在本文的下半部分,我会再讲一个抽象的例子,以便能让大家从卷积中能更好地了解数学与生活的联系。&lt;br /&gt;最后提醒各位，请勿亲身尝试&amp;#8230;&amp;#8230;&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;label style="color: #666; font-size: 13px"&gt;本文引用地址：&lt;/label&gt;&lt;a style="color: #666; font-size: 13px" href="http://blog.sciencenet.cn/home.php?mod=space&amp;amp;uid=44001&amp;amp;do=blog&amp;amp;id=274697" target="_blank"&gt;http://blog.sciencenet.cn/home.php?mod=space&amp;amp;uid=44001&amp;amp;do=blog&amp;amp;id=274697&lt;/a&gt;&lt;img src="http://www.cnblogs.com/lancidie/aggbug/2327968.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lancidie/archive/2012/01/20/2327968.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
