<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_大熊 | Zealot Yin</title><subtitle type="text">将编程作为一项终生事业.并乐此不疲.简单并且快乐着...</subtitle><id>http://feed.cnblogs.com/blog/u/67679/rss</id><updated>2012-04-26T11:43:34Z</updated><author><name>大熊 | Zealot Yin</name><uri>http://www.cnblogs.com/Creator/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Creator/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/67679/rss"/><entry><id>http://www.cnblogs.com/Creator/archive/2012/04/18/2455584.html</id><title type="text">线程同步之条件变量使用手记</title><summary type="text">由来：最近一直在想怎么高效率的在IO线程接收到数据时通知逻辑线程（基于线程池）工作的问题，像网络编程的服务器模型的一些模型都需要用到这个实现，下面我这里简单的罗列一个多线程的网络服务器模型半同步/半异步（half-sync/half-async）：许多餐厅使用半同步/半异步模式的变体。例如，餐厅常常雇佣一个领班负责迎接顾客，并在餐厅繁忙时留意给顾客安排桌位，为等待就餐的顾客按序排队是必要的。领班由所有顾客“共享”，不能被任何特定顾客占用太多时间。当顾客在一张桌子入坐后，有一个侍应生专门为这张桌子服务。对于上面罗列的这种模型，本文讨论的问题是当领班接到客人时，如何高效率的通知侍应生去服务顾客.在</summary><published>2012-04-18T11:14:00Z</published><updated>2012-04-18T11:14:00Z</updated><author><name>大熊 | Zealot Yin</name><uri>http://www.cnblogs.com/Creator/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Creator/archive/2012/04/18/2455584.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Creator/archive/2012/04/18/2455584.html"/><content type="html">&lt;p&gt;&lt;span style="font-size: 18pt;"&gt;&lt;strong&gt;由来：&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;最近一直在想怎么高效率的在IO线程接收到数据时通知逻辑线程（基于线程池）工作的问题，像网络编程的服务器模型的一些模型都需要用到这个实现，下面我这里简单的罗列一个多线程的网络服务器模型&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;半同步/半异步（half-sync/half-async）：&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;许多餐厅使用&amp;nbsp;半同步/半异步&amp;nbsp;模式的变体。例如，餐厅常常雇佣一个领班负责迎接顾客，并在餐厅繁忙时留意给顾客安排桌位，为等待就餐的顾客按序排队是必要的。领班由所有顾客&amp;ldquo;共享&amp;rdquo;，不能被任何特定顾客占用太多时间。当顾客在一张桌子入坐后，有一个侍应生专门为这张桌子服务。&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;对于上面罗列的这种模型，本文讨论的问题是当领班接到客人时，如何高效率的通知侍应生去服务顾客.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;在我们使用很广泛的线程池实现中，也会有一样的问题&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18pt;"&gt;&lt;strong&gt;方法实现：&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;1.使用锁+轮询&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;使用这种方法可以很简单的实现，但是会有一定的性能消耗，其还有一个点要好好把握，就是一次轮询没有结果后相隔多久进行下一次的轮询，间隔时间太短，消耗的CPU资源较多，间隔时间太长，不能很及时的响应请求。这就相当于上面的这个例子，侍应生时不时的取询问领班有没有顾客到来&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 16px;"&gt;2.使用条件变量的线程同步&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;线程条件变量pthread_cond_t&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;线程等待某个条件&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;int pthread_cond_timedwait(pthread_cond_t *restrict &lt;em&gt;cond&lt;/em&gt;,pthread_mutex_t *restrict &lt;em&gt;mutex&lt;/em&gt;,const struct timespec *restrict &lt;em&gt;abstime&lt;/em&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 16px;"&gt;int pthread_cond_wait(pthread_cond_t *restrict &lt;em&gt;cond&lt;/em&gt;,pthread_mutex_t *restrict &lt;em&gt;mutex&lt;/em&gt;); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 16px;"&gt;通知函数&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;通知所有的线程&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;int pthread_cond_broadcast(pthread_cond_t *cond);&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;只通知一个线程&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 16px;"&gt;int pthread_cond_signal(pthread_cond_t *cond);&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;正确的使用方法&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;pthread_cond_wait用法&lt;/strong&gt;：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;pthread_mutex_lock(&amp;amp;mutex);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;while(condition_is_false)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;&amp;nbsp;&amp;nbsp;{&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;&amp;nbsp;pthread_cond_wait(&amp;amp;cond,&amp;amp;mutex);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;&amp;nbsp;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;condition_is_false=true;&amp;nbsp; //此操作是带锁的，也就是说只有一个线程同时进入这块&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;pthread_mutex_unlock(&amp;amp;mutex);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;pthread_cond_signal&lt;/strong&gt;用法：&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;pthread_mutex_lock(&amp;amp;mutex);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;condition_is_false=false;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;pthread_cond_signal(&amp;amp;cond)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;pthread_mutex_unlock(&amp;amp;mutex)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;我刚初用的时候，觉得非常的奇怪，为什么要这样用，加了mutex后还需要一个condition_is_false变量来表示有没有活干。其实这样子的一个操作主要是为了解决&amp;ldquo;假激活&amp;rdquo;问题，因为我么您这里的使用场景，只需要激活一个线程，因为一个线程干一个活，而不是多个线程干一个活，所以为了避免线程被激活了，但实际又没有事情干，所以使用了这么一套机制。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;实际上，信号和pthread_cond_broadcast是两个常见的导致假唤醒的情况。假如条件变量上有多个线程在等待,pthread_cond_broadcast会唤醒所有的等待线程，而pthread_cond_signal只会唤醒其中一个等待线程。这样,pthread_cond_broadcast的情况也许要在pthread_cond_wait前使用while循环来检查条件变量。&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;来个例子：&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('f180b78b-7998-4083-99eb-4b3b7192f2e5')"&gt;&lt;span style="font-size: 16px;"&gt;&lt;/span&gt;&lt;div id="cnblogs_code_open_f180b78b-7998-4083-99eb-4b3b7192f2e5" class="cnblogs_code_hide"&gt;&lt;span style="font-size: 16px;"&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; #include &amp;lt;pthread.h&amp;gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; #include &amp;lt;stdio.h&amp;gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; #include&amp;lt;stdlib.h&amp;gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; #include&amp;lt;unistd.h&amp;gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; For safe condition variable usage, must use a boolean predicate and  &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; a mutex with the condition.                                          &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;                 workToDo = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; pthread_cond_t      cond  =&lt;span style="color: #000000;"&gt; PTHREAD_COND_INITIALIZER;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; pthread_mutex_t     mutex =&lt;span style="color: #000000;"&gt; PTHREAD_MUTEX_INITIALIZER;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#define&lt;/span&gt; NTHREADS      20&lt;br/&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt;  &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; checkResults(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; rc) {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (rc) {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt;      printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Error on : %s, rc=%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;, rc);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; &lt;span style="color: #000000;"&gt;     exit(EXIT_FAILURE);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt; &lt;span style="color: #000000;"&gt;   }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; *threadfunc(&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; *&lt;span style="color: #000000;"&gt;parm)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;           rc;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt; (&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;) {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt;     &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; Usually worker threads will loop on these operations &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt;     rc = pthread_mutex_lock(&amp;amp;&lt;span style="color: #000000;"&gt;mutex);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt;     checkResults(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;pthread_mutex_lock()\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, rc);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;31&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;32&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt; (!&lt;span style="color: #000000;"&gt;workToDo) {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;33&lt;/span&gt;       printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Thread blocked\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;34&lt;/span&gt;       rc = pthread_cond_wait(&amp;amp;cond, &amp;amp;&lt;span style="color: #000000;"&gt;mutex);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;35&lt;/span&gt;       checkResults(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;pthread_cond_wait()\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, rc);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;36&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;37&lt;/span&gt;     printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Thread awake, finish work!\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;38&lt;/span&gt;     sleep(&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;39&lt;/span&gt;     &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; Under protection of the lock, complete or remove the work     &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;40&lt;/span&gt;     &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; from whatever worker queue we have. Here it is simply a flag  &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;41&lt;/span&gt;     workToDo = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;42&lt;/span&gt;     printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;In  mutex lock\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;43&lt;/span&gt;     rc = pthread_mutex_unlock(&amp;amp;&lt;span style="color: #000000;"&gt;mutex);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;44&lt;/span&gt;     sleep(&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;45&lt;/span&gt;     printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Out mutex lock\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;46&lt;/span&gt;     checkResults(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;pthread_mutex_lock()\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, rc);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;47&lt;/span&gt; &lt;span style="color: #000000;"&gt;  }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;48&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; NULL;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;49&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;50&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;51&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; **&lt;span style="color: #000000;"&gt;argv)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;52&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;53&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;                   rc=&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;54&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;                   i;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;55&lt;/span&gt; &lt;span style="color: #000000;"&gt;  pthread_t             threadid[NTHREADS];&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;56&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;57&lt;/span&gt;   printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Enter Testcase - %s\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, argv[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;58&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;59&lt;/span&gt;   printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Create %d threads\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, NTHREADS);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;60&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i=&lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i&amp;lt;NTHREADS; ++&lt;span style="color: #000000;"&gt;i) {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;61&lt;/span&gt;     rc = pthread_create(&amp;amp;&lt;span style="color: #000000;"&gt;threadid[i], NULL, threadfunc, NULL);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;62&lt;/span&gt;     checkResults(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;pthread_create()\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, rc);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;63&lt;/span&gt; &lt;span style="color: #000000;"&gt;  }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;64&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;65&lt;/span&gt;   sleep(&lt;span style="color: #800080;"&gt;5&lt;/span&gt;);  &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; Sleep is not a very robust way to serialize threads   &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;66&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;67&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i=&lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i&amp;lt;&lt;span style="color: #800080;"&gt;5&lt;/span&gt;; ++&lt;span style="color: #000000;"&gt;i) {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;68&lt;/span&gt;     printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Wake up a worker, work to do...\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;69&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;70&lt;/span&gt;     rc = pthread_mutex_lock(&amp;amp;&lt;span style="color: #000000;"&gt;mutex);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;71&lt;/span&gt;     checkResults(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;pthread_mutex_lock()\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, rc);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;72&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;73&lt;/span&gt;     &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; In the real world, all the threads might be busy, and        &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;74&lt;/span&gt;     &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; we would add work to a queue instead of simply using a flag  &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;75&lt;/span&gt;     &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; In that case the boolean predicate might be some boolean     &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;76&lt;/span&gt;     &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; statement like: if (the-queue-contains-work)                 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;77&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (workToDo) {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;78&lt;/span&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Work already present, likely threads are busy\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;79&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;80&lt;/span&gt;     workToDo = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;81&lt;/span&gt;     rc = pthread_cond_broadcast(&amp;amp;&lt;span style="color: #000000;"&gt;cond);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;82&lt;/span&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; rc = pthread_cond_signal(&amp;amp;cond);&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;83&lt;/span&gt;     checkResults(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;pthread_cond_broadcast()\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, rc);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;84&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;85&lt;/span&gt;     rc = pthread_mutex_unlock(&amp;amp;&lt;span style="color: #000000;"&gt;mutex);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;86&lt;/span&gt;     checkResults(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;pthread_mutex_unlock()\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, rc);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;87&lt;/span&gt;     sleep(&lt;span style="color: #800080;"&gt;5&lt;/span&gt;);  &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; Sleep is not a very robust way to serialize threads &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;88&lt;/span&gt; &lt;span style="color: #000000;"&gt;  }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;89&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;90&lt;/span&gt;   printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Main completed\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;91&lt;/span&gt;   exit(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;92&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;93&lt;/span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;事实上上面的例子无论是使用pthread_cond_signal还是pthread_cond_broadcast，都只会打印&lt;span style="color: #800000;"&gt;Thread&amp;nbsp;awake,&amp;nbsp;finish&amp;nbsp;work&lt;/span&gt;5次，大家可能会觉得非常奇怪，但是实际情况就是这样的。&amp;nbsp;为了明白其pthread_cont_wait内部干了什么工作，有必要深入一下其内部实现。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;关于其内部实现伪代码如下：&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #000000;"&gt;pthread_cond_wait(mutex, cond):&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt;     value = cond-&amp;gt;value; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 1 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt;     pthread_mutex_unlock(mutex); &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 2 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt;     pthread_mutex_lock(cond-&amp;gt;mutex); &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 10 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;    pthread_cond_t自带一个mutex来互斥对waiter等待链表的操作&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (value == cond-&amp;gt;value) { &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 11 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;    检查一次是不是cond有被其他线程设置过，相当于单例模式的第二次检测是否为NULL&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt;         me-&amp;gt;next_cond = cond-&amp;gt;&lt;span style="color: #000000;"&gt;waiter;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt;         cond-&amp;gt;waiter = me;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;链表操作&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt;         pthread_mutex_unlock(cond-&amp;gt;&lt;span style="color: #000000;"&gt;mutex);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;        unable_to_run(me);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt;     } &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt;         pthread_mutex_unlock(cond-&amp;gt;mutex); &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 12 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt;     pthread_mutex_lock(mutex); &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 13 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;    &lt;br/&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt;     &lt;br/&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; &lt;span style="color: #000000;"&gt;pthread_cond_signal(cond):&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt;     pthread_mutex_lock(cond-&amp;gt;mutex); &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 3 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt;     cond-&amp;gt;value++; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 4 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (cond-&amp;gt;waiter) { &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 5 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt;         sleeper = cond-&amp;gt;waiter; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 6 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt;         cond-&amp;gt;waiter = sleeper-&amp;gt;next_cond; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 7 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;链表操作&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt;         able_to_run(sleeper); &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 8 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;    运行sleep的线程，即上面的me&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt;     pthread_mutex_unlock(cond-&amp;gt;mutex); &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 9 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;pthread_cond_broadcast虽然能够激活所有的线程，但是激活之后会有mutex锁，也就是说他的激活是顺序进行的，只有第一个激活的线程调用pthread_mutex_unlock(&amp;amp;mutex)后，后一个等待的线程才会继续运行.因为从pthread_cond_wait(&amp;amp;cond,&amp;amp;mutex)到pthread_mutex_unlock(&amp;amp;mutex)区间是加的独占锁，从wait激活后的第一个线程占用了这个锁，所以其他的线程不能运行，只能等待。所以当第一个被激活的线程修改了condition_is_false后（上面测试代码的workToDo），接着调用pthread_mutex_unlock(&amp;amp;mutex)后，此时其他等待在cond的一个线程会激活，但是此时condition_is_false已经被设置，所以他跑不出while循环，当调用pthread_cond_wait时，其内部pthread_mutex_unlock(mutex)调用会导致另一个在它后面的等待在cond的线程被激活。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;所以，通过这种方式，即便是误调用了pthread_cond_broadcast或者由于信号中断的原因激活了所有在等待条件的线程，也能保证其结果是正确的。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;span style="line-height: 24px;"&gt;另外说一句题外话，很多人写的基于条件变量线程同步的框架，说自己是无锁的，其实这是不对的，只是内部锁的机制在&lt;span&gt;pthread_cond_wait实现了而已，其还是基于互斥锁的实现。真正想要达到无锁的可以关注一下lockfree相关的CAS算法，其内部使用一个intel CPU的cmpxchg8指令完成的，其实这种实现个人认为和传统锁相比只是一个非阻塞锁和阻塞锁的区别。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Creator/aggbug/2455584.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Creator/archive/2012/04/18/2455584.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Creator/archive/2012/04/11/2430592.html</id><title type="text">内存池技术畅想</title><summary type="text">内容：本文将介绍几种常用的内存池技术的实现，这是我最近学习各大开源的内存池技术遗留下来的笔记，其主要内容包括：STL内存池以及类STL内存池实现Memcached内存池实现固定规格内存池实现Nginx内存池实现一.类STL的内存池实现方式SGI STL的内存池分为一级配置器和二级配置器，一级配置器主要处理分配空间大小大于128Byte的需求，其内部实现就是直接使用malloc realloc 和free.二级配置器则使用使用free_list的数组链表的方式来管理内存，SGI的Allocate最小的分辨单位为8Byte,其free_list数组存着8*n（n=1...16)大小内存的首地址,</summary><published>2012-04-10T17:04:00Z</published><updated>2012-04-10T17:04:00Z</updated><author><name>大熊 | Zealot Yin</name><uri>http://www.cnblogs.com/Creator/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Creator/archive/2012/04/11/2430592.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Creator/archive/2012/04/11/2430592.html"/><content type="html">&lt;p&gt;&lt;span style="font-size: 18pt; "&gt;&lt;strong&gt;&amp;nbsp;内容：&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;本文将介绍几种常用的内存池技术的实现，这是我最近学习各大开源的内存池技术遗留下来的笔记，其主要内容包括：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: 12pt; "&gt;STL内存池以及类STL内存池实现&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 12pt; "&gt;Memcached内存池实现&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 12pt; "&gt;固定规格内存池实现&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 12pt; "&gt;Nginx内存池实现&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18pt; "&gt;&lt;strong&gt;一.类STL的内存池实现方式&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;SGI STL的内存池分为一级配置器和二级配置器，&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;一级配置器主要处理分配空间大小大于128Byte的需求，其内部实现就是直接使用malloc &amp;nbsp;realloc 和free.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;二级配置器则使用使用free_list的数组链表的方式来管理内存，SGI的Allocate最小的分辨单位为8Byte,其free_list数组存着8*n（n=1...16)大小内存的首地址,大小同样的内存块使用链表的形式相连&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp;&amp;nbsp;free_list[0] --------&amp;gt; 8 byte&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp;&amp;nbsp;free_list[1] --------&amp;gt; 16 byte&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp; free_list[2] --------&amp;gt; 24 byte&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp; free_list[3] --------&amp;gt; 32 byte&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp;&amp;nbsp;... ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp;&amp;nbsp;free_list[15] -------&amp;gt; 128 byte&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp;因为其对内存的管理的最小分辨度为8Byte,所以当我们申请的内存空间不是8的倍数的时候，内存池会将其调整为8的倍数大小，这叫内存对齐。当然这也免不了带来内存浪费，例如我们只需要一个10Byte的大小，内存池经过内存对齐后，会给我们一个16Byte的大小，而剩余的6Byte，在这次使用中根本没有用到。（&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;对于chunk_allocate的优化请见&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; text-decoration: none; font-size: 12pt; "&gt;&lt;span style="font-size: 12pt; "&gt;&lt;a href="http://www.cnblogs.com/Creator/archive/2012/04/05/2433386.html"&gt;探究操作系统的内存分配（malloc）对齐策略&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;一文的末尾处）&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;类STL的内存池一般都有如下API&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;void* allocate(size_t __n) &lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;//外部API，分配内存&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;void deallocate(void* __p, size_t __n)&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;//外部API，回收内存，以供再利用&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;char* &amp;nbsp;chunk_alloc(size_t __size, int&amp;amp; __nobjs)&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;//内部函数，用于分配一个大块&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;void* refill(size_t n)&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;//内部函数，用于allocate从free_list中未找到可使用的块时调用&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp;这种内存池的工作流程大致如下：&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: 12pt; "&gt;外部调用&amp;nbsp;allocate向内存池申请内存&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 12pt; "&gt;allocate通过内存对齐的方式在free_list找到合适的内存块链表头&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 12pt; "&gt;判断链表头是否为NULL,为NULL则表示没有此规格空闲的内存，如果不为NULL，则返那块内存地址，并将此块内存地址移除它对应的链表&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 12pt; "&gt;如果为NULL，则调用refill在freelist上挂载20个此规格的内存空间（形成链表），也就是保证此规格的内存空间下次请求时够用&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 12pt; "&gt;refill的内部调用了chunk_alloc函数，chunk_alloc的职责就是负责内存池的所有内存的生产，在生产的时候他为了保证下次能有内存用，所以会将空间*2，所以这个申请流程总的内存消耗为：（对需求规格内存对齐后的大小）*20*2&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;下面举一个例子来简单得说明一下：&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp; &amp;nbsp; 当第一次调用chunk_alloc(32,10)的时候，表示我要申请10块__Obje(free_list)， 每块大小32B，此时，内存池大小为0，从堆空间申请32*20的大小的内存，把其中32*10大小的分给free_list[3]。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp; &amp;nbsp;我再次申请64*5大小的空间，此时free_list[7]为0， 它要从内存池提取内存，而此时内存池剩下320B，刚好填充给free_list[7]，内存池此时大小为0。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp; &amp;nbsp;第三次请求72*10大小的空间，此时free_list[8]为0，它要从内存池提取内存，此时内存池空间不足，再次从堆空间申请72*20大小的空间，分72*10给free_list用。&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;首次申请20Byte后的状态图：&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;img src="http://images.cnblogs.com/cnblogs_com/creator/blog_img/o_mem.jpg" width="483" height="314" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp;在未设置预分配的STL内存池中，某个中间状态的整体图&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/creator/blog_img/4633581059150863064.jpg" width="451" height="433" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;由于STL源码可阅读性不强，各种宏等等满目不堪，&lt;em&gt;&lt;u&gt;所以我这里就不贴SGI 的源码了&lt;/u&gt;&lt;/em&gt;，我在这里贴一个简单易懂的山寨版本， 基本的思路是一模一样的，这个实现没有了一级和二级配置器，而是在需要的时候直接malloc或者从free_list找。&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('3f681902-03df-4de1-be12-92795050eaac')"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_3f681902-03df-4de1-be12-92795050eaac" alt="" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_3f681902-03df-4de1-be12-92795050eaac" onclick="cnblogs_code_hide('3f681902-03df-4de1-be12-92795050eaac',event)" style="display:none"&gt;&lt;div id="cnblogs_code_open_3f681902-03df-4de1-be12-92795050eaac" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;.&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;#ifndef&amp;nbsp;MEMORYPOOL_H&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#define&lt;/span&gt;&amp;nbsp;MEMORYPOOL_H&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;#include&amp;nbsp;&amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;#include&amp;nbsp;&amp;lt;assert.h&amp;gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;namespace&lt;/span&gt;&amp;nbsp;std;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;10&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;MemoryPool&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;11&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;12&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;:&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;13&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;14&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Really&amp;nbsp;we&amp;nbsp;should&amp;nbsp;use&amp;nbsp;static&amp;nbsp;const&amp;nbsp;int&amp;nbsp;x&amp;nbsp;=&amp;nbsp;N&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;15&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&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;&amp;nbsp;instead&amp;nbsp;of&amp;nbsp;enum&amp;nbsp;{&amp;nbsp;x&amp;nbsp;=&amp;nbsp;N&amp;nbsp;},&amp;nbsp;but&amp;nbsp;few&amp;nbsp;compilers&amp;nbsp;accept&amp;nbsp;the&amp;nbsp;former.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;16&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;enum&lt;/span&gt;&amp;nbsp;{__ALIGN&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;8&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;小型区块的上调边界，即小型内存块每次上调8byte&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;17&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;enum&lt;/span&gt;&amp;nbsp;{__MAX_BYTES&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;128&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;小型区块的上界&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;18&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;enum&lt;/span&gt;&amp;nbsp;{__NFREELISTS&amp;nbsp;=&amp;nbsp;__MAX_BYTES/__ALIGN};&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;free-lists的个数，为:16，每个free-list管理不同大小内存块的配置&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;19&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;20&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;将请求的内存大小上调整为8byte的倍数，比如8byte,&amp;nbsp;16byte,&amp;nbsp;24byte,&amp;nbsp;32byte&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;21&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;size_t&amp;nbsp;ROUND_UP(size_t&amp;nbsp;bytes)&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;22&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;23&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;(((bytes)&amp;nbsp;+&amp;nbsp;__ALIGN-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&amp;nbsp;&amp;amp;&amp;nbsp;~(__ALIGN&amp;nbsp;-&amp;nbsp;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;));&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;24&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;25&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;26&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;union&amp;nbsp;obj&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;27&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;28&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;union&amp;nbsp;obj*&amp;nbsp;free_list_link;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;下一个区块的内存地址，如果为NULL，则表示无可用区块&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;29&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;&amp;nbsp;client_data[&lt;span style="color: #800080;"&gt;1&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;内存区块的起始地址&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;30&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;31&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;32&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;:&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;33&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;obj&amp;nbsp;*free_list[__NFREELISTS];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;__NFREELISTS&amp;nbsp;=&amp;nbsp;16&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;34&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&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;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;35&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;free_list[0]&amp;nbsp;--------&amp;gt;&amp;nbsp;8&amp;nbsp;byte（free_list[0]管理8bye区块的配置）&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;36&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;free_list[1]&amp;nbsp;--------&amp;gt;&amp;nbsp;16&amp;nbsp;byte&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;37&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;free_list[2]&amp;nbsp;--------&amp;gt;&amp;nbsp;24&amp;nbsp;byte&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;38&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;free_list[3]&amp;nbsp;--------&amp;gt;&amp;nbsp;32&amp;nbsp;byte&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;39&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&amp;nbsp;...&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;40&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;free_list[15]&amp;nbsp;-------&amp;gt;&amp;nbsp;128&amp;nbsp;byte&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;41&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;42&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;43&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;根据区块大小，决定使用第n号的free_list。n&amp;nbsp;=&amp;nbsp;[0,&amp;nbsp;15]开始&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;44&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;&amp;nbsp;size_t&amp;nbsp;FREELIST_INDEX(size_t&amp;nbsp;bytes)&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;45&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;46&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;(((bytes)&amp;nbsp;+&amp;nbsp;__ALIGN-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)/__ALIGN&amp;nbsp;-&amp;nbsp;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;47&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;48&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;49&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Returns&amp;nbsp;an&amp;nbsp;object&amp;nbsp;of&amp;nbsp;size&amp;nbsp;n,&amp;nbsp;and&amp;nbsp;optionally&amp;nbsp;adds&amp;nbsp;to&amp;nbsp;size&amp;nbsp;n&amp;nbsp;free&amp;nbsp;list.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;50&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;*refill(size_t&amp;nbsp;n);&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;51&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;52&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;配置一大块空间，可容纳nobjs个大小为size的区块&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;53&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;如果配置nobjs个区块有所不便，nobjs可能会降低&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;54&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;&amp;nbsp;*chunk_alloc(size_t&amp;nbsp;size,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;&amp;amp;nobjs);&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;55&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;56&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Chunk&amp;nbsp;allocation&amp;nbsp;state.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;57&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;&amp;nbsp;*start_free;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;内存池起始位置&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;58&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;&amp;nbsp;*end_free;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;内存池结束位置&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;59&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;size_t&amp;nbsp;heap_size;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;内存池的大小&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;60&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;61&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;:&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;62&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;63&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;公开接口，内存分配函数&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;64&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;*&amp;nbsp;allocate(size_t&amp;nbsp;n)&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;65&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;66&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;obj**&amp;nbsp;my_free_list&amp;nbsp;=&amp;nbsp;NULL;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;67&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;obj*&amp;nbsp;result&amp;nbsp;=&amp;nbsp;NULL;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;68&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;69&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;如果待分配的内存字节数大于128byte,就调用C标准库函数malloc&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;70&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(n&amp;nbsp;&amp;gt;&amp;nbsp;(size_t)&amp;nbsp;__MAX_BYTES)&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;71&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;72&lt;/span&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;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;malloc(n);&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;73&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;74&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;75&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;调整my_free_lisyt，从这里取用户请求的区块&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;76&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;my_free_list&amp;nbsp;=&amp;nbsp;free_list&amp;nbsp;+&amp;nbsp;FREELIST_INDEX(n);&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;77&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;78&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;79&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;*my_free_list;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;欲返回给客户端的区块&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;80&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;81&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(result&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&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;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;82&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;83&lt;/span&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;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;*r&amp;nbsp;=&amp;nbsp;refill(ROUND_UP(n));&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;84&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;85&lt;/span&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;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;r;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;86&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;87&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;88&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*my_free_list&amp;nbsp;=&amp;nbsp;result-&amp;gt;free_list_link;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;调整链表指针，使其指向下一个有效区块&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;89&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;90&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;result;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;91&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;92&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;93&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;94&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;归还区块&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;95&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;deallocate(&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;*p,&amp;nbsp;size_t&amp;nbsp;n)&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;96&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;97&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;assert(p&amp;nbsp;!=&amp;nbsp;NULL);&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;98&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;99&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;obj*&amp;nbsp;q&amp;nbsp;=&amp;nbsp;(obj&amp;nbsp;*)p;&lt;br /&gt;&lt;span style="color: #008080;"&gt;100&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;obj**&amp;nbsp;my_free_list&amp;nbsp;=&amp;nbsp;NULL;&lt;br /&gt;&lt;span style="color: #008080;"&gt;101&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;102&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;大于128byte就调用第一级内存配置器&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;103&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(n&amp;nbsp;&amp;gt;&amp;nbsp;(size_t)&amp;nbsp;__MAX_BYTES)&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;104&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;105&lt;/span&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;&amp;nbsp;free(p)&amp;nbsp;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;106&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;107&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;108&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;寻找对应的free_list&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;109&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;my_free_list&amp;nbsp;=&amp;nbsp;free_list&amp;nbsp;+&amp;nbsp;FREELIST_INDEX(n);&lt;br /&gt;&lt;span style="color: #008080;"&gt;110&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;111&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;调整free_lis，回收内存&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;112&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;q&amp;nbsp;-&amp;gt;&amp;nbsp;free_list_link&amp;nbsp;=&amp;nbsp;*my_free_list;&lt;br /&gt;&lt;span style="color: #008080;"&gt;113&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*my_free_list&amp;nbsp;=&amp;nbsp;q;&lt;br /&gt;&lt;span style="color: #008080;"&gt;114&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;115&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;116&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;*&amp;nbsp;reallocate(&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;*p,&amp;nbsp;size_t&amp;nbsp;old_sz,&amp;nbsp;size_t&amp;nbsp;new_sz);&lt;br /&gt;&lt;span style="color: #008080;"&gt;117&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;118&lt;/span&gt;&amp;nbsp;}&amp;nbsp;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;119&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;120&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;121&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;We&amp;nbsp;allocate&amp;nbsp;memory&amp;nbsp;in&amp;nbsp;large&amp;nbsp;chunks&amp;nbsp;in&amp;nbsp;order&amp;nbsp;to&amp;nbsp;avoid&amp;nbsp;fragmenting&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;122&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;the&amp;nbsp;malloc&amp;nbsp;heap&amp;nbsp;too&amp;nbsp;much.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;123&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;We&amp;nbsp;assume&amp;nbsp;that&amp;nbsp;size&amp;nbsp;is&amp;nbsp;properly&amp;nbsp;aligned.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;124&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;We&amp;nbsp;hold&amp;nbsp;the&amp;nbsp;allocation&amp;nbsp;lock.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;125&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;126&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;假设size已经上调至8的倍数&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;127&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;注意nobjs是passed&amp;nbsp;by&amp;nbsp;reference,是输入输出参数&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;128&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;*&amp;nbsp;MemoryPool::chunk_alloc(size_t&amp;nbsp;size,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;amp;&amp;nbsp;nobjs)&lt;br /&gt;&lt;span style="color: #008080;"&gt;129&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;130&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;*&amp;nbsp;result&amp;nbsp;=&amp;nbsp;NULL;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;131&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;132&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;size_t&amp;nbsp;total_bytes&amp;nbsp;=&amp;nbsp;size&amp;nbsp;*&amp;nbsp;nobjs;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;请求分配内存块的总大小&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;133&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;size_t&amp;nbsp;bytes_left&amp;nbsp;=&amp;nbsp;end_free&amp;nbsp;-&amp;nbsp;start_free;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;内存池剩余空间的大小&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;134&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;135&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(bytes_left&amp;nbsp;&amp;gt;=&amp;nbsp;total_bytes)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;内存池剩余空间满足要求量&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;136&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;137&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;start_free;&lt;br /&gt;&lt;span style="color: #008080;"&gt;138&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start_free&amp;nbsp;+=&amp;nbsp;total_bytes;&lt;br /&gt;&lt;span style="color: #008080;"&gt;139&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;140&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;result;&lt;br /&gt;&lt;span style="color: #008080;"&gt;141&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;142&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(bytes_left&amp;nbsp;&amp;gt;=&amp;nbsp;size)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;内存池剩余空间不能完全满足需求量，但足够供应一个(含)以上的区块&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;143&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;144&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nobjs&amp;nbsp;=&amp;nbsp;bytes_left/size;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;计算内存池剩余空间足够配置的区块数目&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;145&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total_bytes&amp;nbsp;=&amp;nbsp;size&amp;nbsp;*&amp;nbsp;nobjs;&lt;br /&gt;&lt;span style="color: #008080;"&gt;146&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;147&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;start_free;&lt;br /&gt;&lt;span style="color: #008080;"&gt;148&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start_free&amp;nbsp;+=&amp;nbsp;total_bytes;&lt;br /&gt;&lt;span style="color: #008080;"&gt;149&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;150&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;result;&lt;br /&gt;&lt;span style="color: #008080;"&gt;151&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;152&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;内存池剩余空间连一个区块都无法提供&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;153&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;154&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;bytes_to_get为内存池向malloc请求的内存总量&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;155&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;size_t&amp;nbsp;bytes_to_get&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&amp;nbsp;*&amp;nbsp;total_bytes&amp;nbsp;+&amp;nbsp;ROUND_UP(heap_size&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;4&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;156&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;157&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Try&amp;nbsp;to&amp;nbsp;make&amp;nbsp;use&amp;nbsp;of&amp;nbsp;the&amp;nbsp;left-over&amp;nbsp;piece.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;158&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(bytes_left&amp;nbsp;&amp;gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;159&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;160&lt;/span&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;&amp;nbsp;obj**&amp;nbsp;my_free_list&amp;nbsp;=&amp;nbsp;free_list&amp;nbsp;+&amp;nbsp;FREELIST_INDEX(bytes_left);&lt;br /&gt;&lt;span style="color: #008080;"&gt;161&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;162&lt;/span&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;&amp;nbsp;((obj&amp;nbsp;*)start_free)&amp;nbsp;-&amp;gt;&amp;nbsp;free_list_link&amp;nbsp;=&amp;nbsp;*my_free_list;&lt;br /&gt;&lt;span style="color: #008080;"&gt;163&lt;/span&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;&amp;nbsp;*my_free_list&amp;nbsp;=&amp;nbsp;(obj&amp;nbsp;*)start_free;&lt;br /&gt;&lt;span style="color: #008080;"&gt;164&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;165&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;166&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;调用malloc分配堆空间，用于补充内存池&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;167&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start_free&amp;nbsp;=&amp;nbsp;(&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;&amp;nbsp;*)malloc(bytes_to_get);&lt;br /&gt;&lt;span style="color: #008080;"&gt;168&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&amp;nbsp;==&amp;nbsp;start_free)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;heap空间已满，malloc分配失败&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;169&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;170&lt;/span&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;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;i;&lt;br /&gt;&lt;span style="color: #008080;"&gt;171&lt;/span&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;&amp;nbsp;obj&amp;nbsp;**&amp;nbsp;my_free_list,&amp;nbsp;*p;&lt;br /&gt;&lt;span style="color: #008080;"&gt;172&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;173&lt;/span&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;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;遍历free_list数组，试图通过释放区块达到内存配置需求&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;174&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&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;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;(i&amp;nbsp;=&amp;nbsp;size;&amp;nbsp;i&amp;nbsp;&amp;lt;=&amp;nbsp;__MAX_BYTES;&amp;nbsp;i&amp;nbsp;+=&amp;nbsp;__ALIGN)&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;175&lt;/span&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;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;176&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;my_free_list&amp;nbsp;=&amp;nbsp;free_list&amp;nbsp;+&amp;nbsp;FREELIST_INDEX(i);&lt;br /&gt;&lt;span style="color: #008080;"&gt;177&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p&amp;nbsp;=&amp;nbsp;*my_free_list;&lt;br /&gt;&lt;span style="color: #008080;"&gt;178&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;179&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&amp;nbsp;!=&amp;nbsp;p)&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;180&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;181&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*my_free_list&amp;nbsp;=&amp;nbsp;p&amp;nbsp;-&amp;gt;&amp;nbsp;free_list_link;&lt;br /&gt;&lt;span style="color: #008080;"&gt;182&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start_free&amp;nbsp;=&amp;nbsp;(&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;&amp;nbsp;*)p;&lt;br /&gt;&lt;span style="color: #008080;"&gt;183&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end_free&amp;nbsp;=&amp;nbsp;start_free&amp;nbsp;+&amp;nbsp;i;&lt;br /&gt;&lt;span style="color: #008080;"&gt;184&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;185&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;chunk_alloc(size,&amp;nbsp;nobjs);&lt;br /&gt;&lt;span style="color: #008080;"&gt;186&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Any&amp;nbsp;leftover&amp;nbsp;piece&amp;nbsp;will&amp;nbsp;eventually&amp;nbsp;make&amp;nbsp;it&amp;nbsp;to&amp;nbsp;the&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;187&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;right&amp;nbsp;free&amp;nbsp;list.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;188&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;189&lt;/span&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;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;190&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;191&lt;/span&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;&amp;nbsp;end_free&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;In&amp;nbsp;case&amp;nbsp;of&amp;nbsp;exception.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;192&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;193&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&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;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;调用第一级内存配置器，看看out-of-memory机制能否尽点力&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;194&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&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;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;195&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&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;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;This&amp;nbsp;should&amp;nbsp;either&amp;nbsp;throw&amp;nbsp;an&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;196&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&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;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;exception&amp;nbsp;or&amp;nbsp;remedy&amp;nbsp;the&amp;nbsp;situation.&amp;nbsp;&amp;nbsp;Thus&amp;nbsp;we&amp;nbsp;assume&amp;nbsp;it&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;197&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&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;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;succeeded.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;198&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;199&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;200&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;heap_size&amp;nbsp;+=&amp;nbsp;bytes_to_get;&lt;br /&gt;&lt;span style="color: #008080;"&gt;201&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end_free&amp;nbsp;=&amp;nbsp;start_free&amp;nbsp;+&amp;nbsp;bytes_to_get;&lt;br /&gt;&lt;span style="color: #008080;"&gt;202&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;203&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;chunk_alloc(size,&amp;nbsp;nobjs);&lt;br /&gt;&lt;span style="color: #008080;"&gt;204&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;205&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;206&lt;/span&gt;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;207&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;208&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;209&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Returns&amp;nbsp;an&amp;nbsp;object&amp;nbsp;of&amp;nbsp;size&amp;nbsp;n,&amp;nbsp;and&amp;nbsp;optionally&amp;nbsp;adds&amp;nbsp;to&amp;nbsp;size&amp;nbsp;n&amp;nbsp;free&amp;nbsp;list.&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;210&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;We&amp;nbsp;assume&amp;nbsp;that&amp;nbsp;n&amp;nbsp;is&amp;nbsp;properly&amp;nbsp;aligned.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;211&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;We&amp;nbsp;hold&amp;nbsp;the&amp;nbsp;allocation&amp;nbsp;lock.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;212&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;*&amp;nbsp;MemoryPool::refill(size_t&amp;nbsp;n)&lt;br /&gt;&lt;span style="color: #008080;"&gt;213&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;214&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;nobjs&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;20&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;215&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;216&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;注意nobjs是输入输出参数，passed&amp;nbsp;by&amp;nbsp;reference。&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;217&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;*&amp;nbsp;chunk&amp;nbsp;=&amp;nbsp;chunk_alloc(n,&amp;nbsp;nobjs);&lt;br /&gt;&lt;span style="color: #008080;"&gt;218&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;219&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;obj*&amp;nbsp;*&amp;nbsp;my_free_list&amp;nbsp;=&amp;nbsp;NULL;&lt;br /&gt;&lt;span style="color: #008080;"&gt;220&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;obj*&amp;nbsp;result&amp;nbsp;=&amp;nbsp;NULL;&lt;br /&gt;&lt;span style="color: #008080;"&gt;221&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;obj*&amp;nbsp;current_obj&amp;nbsp;=&amp;nbsp;NULL;&lt;br /&gt;&lt;span style="color: #008080;"&gt;222&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;obj*&amp;nbsp;next_obj&amp;nbsp;=&amp;nbsp;NULL;&lt;br /&gt;&lt;span style="color: #008080;"&gt;223&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;i;&lt;br /&gt;&lt;span style="color: #008080;"&gt;224&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;225&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;如果chunk_alloc只获得了一个区块，这个区块就直接返回给调用者，free_list无新结点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;226&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&amp;nbsp;==&amp;nbsp;nobjs)&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;227&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;228&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;chunk;&lt;br /&gt;&lt;span style="color: #008080;"&gt;229&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;230&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;231&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;调整free_list，纳入新结点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;232&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;my_free_list&amp;nbsp;=&amp;nbsp;free_list&amp;nbsp;+&amp;nbsp;FREELIST_INDEX(n);&lt;br /&gt;&lt;span style="color: #008080;"&gt;233&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;234&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;(obj*)chunk;&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;&lt;/span&gt;&lt;span style="color: #008080;"&gt;235&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;236&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;237&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&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;用chunk_alloc分配而来的大量区块配置对应大小之free_list&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;238&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*my_free_list&amp;nbsp;=&amp;nbsp;next_obj&amp;nbsp;=&amp;nbsp;(obj&amp;nbsp;*)(chunk&amp;nbsp;+&amp;nbsp;n);&lt;br /&gt;&lt;span style="color: #008080;"&gt;239&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;240&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;(i&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&amp;nbsp;;&amp;nbsp;i++)&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;241&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;242&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;current_obj&amp;nbsp;=&amp;nbsp;next_obj;&lt;br /&gt;&lt;span style="color: #008080;"&gt;243&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next_obj&amp;nbsp;=&amp;nbsp;(obj&amp;nbsp;*)((&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;&amp;nbsp;*)next_obj&amp;nbsp;+&amp;nbsp;n);&lt;br /&gt;&lt;span style="color: #008080;"&gt;244&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;245&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(nobjs&amp;nbsp;-&amp;nbsp;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&amp;nbsp;==&amp;nbsp;i)&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;246&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;247&lt;/span&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;&amp;nbsp;current_obj&amp;nbsp;-&amp;gt;&amp;nbsp;free_list_link&amp;nbsp;=&amp;nbsp;NULL;&lt;br /&gt;&lt;span style="color: #008080;"&gt;248&lt;/span&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;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;249&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;250&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;251&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;252&lt;/span&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;&amp;nbsp;current_obj&amp;nbsp;-&amp;gt;&amp;nbsp;free_list_link&amp;nbsp;=&amp;nbsp;next_obj;&lt;br /&gt;&lt;span style="color: #008080;"&gt;253&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;254&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;255&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;256&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;result;&lt;br /&gt;&lt;span style="color: #008080;"&gt;257&lt;/span&gt;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;258&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;259&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;重新配置内存，p指向原有的区块，old_sz为原有区块的大小，new_sz为新区块的大小&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;260&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;*&amp;nbsp;MemoryPool::reallocate(&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;*p,&amp;nbsp;size_t&amp;nbsp;old_sz,&amp;nbsp;size_t&amp;nbsp;new_sz)&lt;br /&gt;&lt;span style="color: #008080;"&gt;261&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;262&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;*&amp;nbsp;result&amp;nbsp;=&amp;nbsp;NULL;&lt;br /&gt;&lt;span style="color: #008080;"&gt;263&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;size_t&amp;nbsp;copy_sz&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;264&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;265&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(old_sz&amp;nbsp;&amp;gt;&amp;nbsp;(size_t)&amp;nbsp;__MAX_BYTES&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;new_sz&amp;nbsp;&amp;gt;&amp;nbsp;(size_t)&amp;nbsp;__MAX_BYTES)&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;266&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;267&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;realloc(p,&amp;nbsp;new_sz);&lt;br /&gt;&lt;span style="color: #008080;"&gt;268&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;269&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;270&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(ROUND_UP(old_sz)&amp;nbsp;==&amp;nbsp;ROUND_UP(new_sz))&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;271&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;272&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;p;&lt;br /&gt;&lt;span style="color: #008080;"&gt;273&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;274&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;275&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;allocate(new_sz);&lt;br /&gt;&lt;span style="color: #008080;"&gt;276&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;copy_sz&amp;nbsp;=&amp;nbsp;new_sz&amp;nbsp;&amp;gt;&amp;nbsp;old_sz?&amp;nbsp;old_sz&amp;nbsp;:&amp;nbsp;new_sz;&lt;br /&gt;&lt;span style="color: #008080;"&gt;277&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;278&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memcpy(result,&amp;nbsp;p,&amp;nbsp;copy_sz);&lt;br /&gt;&lt;span style="color: #008080;"&gt;279&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;280&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;deallocate(p,&amp;nbsp;old_sz);&lt;br /&gt;&lt;span style="color: #008080;"&gt;281&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;282&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;result;&lt;br /&gt;&lt;span style="color: #008080;"&gt;283&lt;/span&gt;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: #008080;"&gt;284&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;285&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;静态成员变量初始化&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;286&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;*&amp;nbsp;MemoryPool::start_free&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;287&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;288&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;*&amp;nbsp;MemoryPool::end_free&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;289&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;290&lt;/span&gt;&amp;nbsp;size_t&amp;nbsp;MemoryPool::heap_size&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;291&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;292&lt;/span&gt;&amp;nbsp;MemoryPool::obj*&amp;nbsp;MemoryPool::free_list[MemoryPool::__NFREELISTS]&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;293&lt;/span&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;&amp;nbsp;&amp;nbsp;&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;span style="color: #800080;"&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;,&amp;nbsp;};&lt;br /&gt;&lt;span style="color: #008080;"&gt;294&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;295&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;296&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18pt; "&gt;&amp;nbsp;&lt;strong&gt;二.MemCached内存池实现&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;与类STL内存池不同的是， 用于缓存的内存池不是解决小对象的内存分配可能导致堆内存碎片多的问题，缓存内存池要为缓存系统的所有存储对象分配空间，无论大小。因为缓存系统通常对其占用的最大内存有限制，所以也就不能在没有空间用的时候随便malloc来实现了。&amp;nbsp;MemCached的内存池的基本想法是避免重复大量的初始化和清理操作。&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;Memcached 中内存分配机制主要理念&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;1. &amp;nbsp;先为分配相应的大块内存，再在上面进行无缝小对象填充&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;2. &amp;nbsp;懒惰检测机制，Memcached 不花过多的时间在检测各个item对象是否超时，当 get获取数据时，才检查item对象是否应该删除，你不访问，我就不处理。&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;3. &amp;nbsp;懒惰删除机制，在 memecached 中删除一个 item对象的时候，并不是从内存中释放，而是单单的进行标记处理，再将其指针放入 slot回收插糟，下次分配的时候直接使用。&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;MemCached内存池Slab Allocation的主要术语&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;Page&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;分配给Slab的内存空间，默认是1MB。分配给Slab之后根据slab的大小切分成chunk。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/creator/blog_img/QQ%E6%88%AA%E5%9B%BE20120404215420.jpg" width="448" height="247" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;Chunk&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="white-space: pre; "&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;用于缓存记录的内存空间。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;Slab Class&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="white-space: pre; "&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;特定大小的chunk的组。&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/creator/blog_img/QQ%E6%88%AA%E5%9B%BE20120404215208.jpg" width="559" height="388" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;Memcached的内存分配以page为单位，默认情况下一个page是1M&amp;nbsp;，可以通过-I参数在启动时指定。如果需要申请内存 时，memcached会划分出一个新的page并分配给需要的slab区域。Memcached并不是将所有大小的数据都放在一起的，而是预先将数据空间划分为一系列slabs，每个slab只负责一定范围内的数据存储，其大小可以通过启动参数设置增长因子，默认为1.25，即下一个slab的大小是上一个的1.25倍。如  下图，每个slab只存储大于其上一个slab的size并小于或者等于自己最大size的数据。如下图所示，需要存储一个100Bytes的对象时，会选用112Bytes的Slab Classes&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;img src="http://images.cnblogs.com/cnblogs_com/creator/blog_img/QQ%E6%88%AA%E5%9B%BE20120404213923.jpg" width="519" height="380" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp;基于这种实现的内存池也会遇到STL内存池一样的问题，那就是资源的浪费，我只需要100Byte的空间，你却给了我128Bytes,剩余的28Bytes就浪费了&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/creator/blog_img/QQ%E6%88%AA%E5%9B%BE20120404214300.jpg" width="550" height="193" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;其主要API：&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;slabs_init()&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;slab初始化，如果配置时采用预分配机制(prealloc)则在先在这使用malloc分配所有内存。&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;再根据增长因子factor 给每个 slabclass 分配容量。&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;slabs_clsid()&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;计算出哪个 slabclass 适合用来储存大小给定为 size的item， 如果返回值为 0则存储的物件过大，无法进行存储。&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;do_slabs_alloc()&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;在这个函数里面，由宏定义来决定采用系统自带的 malloc 机制还是 memcached的slab机制对内存进行分配，理所当然，在大多数情况下，系统的malloc会比slab慢上一个&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;数量级。&amp;nbsp;分配时首先考虑slot 内的空间(被回收的空间),再检查 end_page_ptr 指针指向的的空闲空间，还是没有的空间的话，再试试分配新的内存。如果所有空间都用尽的&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;时候，&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;则返回NULL表示目前资源已经枯竭了。&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;do_slabs_free()&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;首先检查当目前的插糟是否已经达到可用总插糟的总容量，如果达到就为其重新分配空间，再将该回收的 item的指针插入对应当前 id的 slabclass 的插糟 （slots） 之中。&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp;关于MemCached还有个问题需要解释下，在预分配的场景下，有的同事认为MemCached不适合大量存储某个特定大小范围内的对象，他们认为预分配的条件下，每个SlabClasses的总大小是固定的（为一个Page),其实不是，MemCached预分配并不会消耗掉所有的内存，在请求空间的时候，如果发现这个型号的Chunks都被用完了，就会新增一个分页到这个Slab Classes，所以是不会出现那位同事说的那个问题的...（可见代码slabs.c中do_slabs_alloc函数中do_slabs_newslab的调用）&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 18pt; "&gt;&lt;strong&gt;三.固定大小内存池&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;上面两种内存池的实现，都会造成一定程度的内存浪费，如果我存的对象大小基本是固定的，尽管有很多不同的对象，有没有不会浪费内存的的简单方式呢？&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;既然需要存的对象大小是固定的，那么我们的内存池对于内存的管理可以这样实现：&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;class IovecContainer&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;public:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;list&amp;lt;char*&amp;gt; m_objList;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;};&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;class MemoryPool&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;public:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;void* allocate(size_t __n)&amp;nbsp;&lt;/span&gt;&lt;span style="white-space: pre; "&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;//外部API，分配内存&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;void deallocate(void* __p, size_t __n)&lt;/span&gt;&lt;span style="white-space: pre; "&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;//外部API，回收内存，以供再利用 &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;private:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;map&amp;lt;int, IovecContainer* &amp;gt; m_mapPool;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;char* &amp;nbsp;chunk_alloc(size_t __size, int&amp;amp; __nobjs)&lt;/span&gt;&lt;span style="white-space: pre; "&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;//内部函数，用于分配一个大块&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;void* refill(size_t n)&amp;nbsp;&lt;/span&gt;&lt;span style="white-space: pre; "&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;//内部函数，用于allocate从free_list中未找到可使用的块时调用&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;};&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;这样的实现对于这个特定的需求非常好用,不回浪费掉剩余空间，但是这样的实现局限性就高了，我们不能用这个内存池来存储大小不定的对象（如string)，如果用了，此内存池形同虚设，并且还浪费内存，所以具体怎么选择还是要看需求来定...&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: 18pt; "&gt;&lt;strong&gt;&amp;nbsp;四.Nginx内存池实现&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp;关于Nginx内存池实现网上有比较多的分析文章，这里我就不重复造轮子了，直接贴链接，有兴趣的可以关注下：&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;http://blog.csdn.net/v_july_v/article/details/7040425&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;http://bbs.chinaunix.net/thread-3626006-1-1.html；&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;http://blog.csdn.net/livelylittlefish/article/details/6586946；&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;http://blog.chinaunix.net/space.php?uid=7201775；&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;淘宝数据共享平台博客：http://www.tbdata.org/archives/1390&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 14pt; "&gt;晚了，睡觉！！！呵呵呵...&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.cnblogs.com/Emoticons/qface/055242240.gif" alt="" /&gt;&lt;img src="http://www.cnblogs.com/Emoticons/face/012.gif" alt="" /&gt;&lt;img src="http://www.cnblogs.com/Emoticons/face/026.gif" alt="" /&gt;&lt;img src="http://www.cnblogs.com/Emoticons/yoyocici/223854210.gif" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;参考资料：&lt;a href="http://www.cnblogs.com/sld666666/archive/2010/07/01/1769448.html" data-ke-src="http://www.cnblogs.com/sld666666/archive/2010/07/01/1769448.html"&gt;http://www.cnblogs.com/sld666666/archive/2010/07/01/1769448.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Creator/aggbug/2430592.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Creator/archive/2012/04/11/2430592.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Creator/archive/2012/04/05/2433386.html</id><title type="text">探究操作系统的内存分配（malloc）对齐策略</title><summary type="text">问题： 我们在写程序的时候经常发现程序使用的内存往往比我们申请的多，为了优化程序的内存占用，搅尽脑汁想要优化内存占用，可是发现自己的代码也无从优化了，怎么办？现在我们把我们的焦点放到malloc上，毕竟我们向系统申请的内存都是通过它完成了，不了解他，也就不能彻底的优化内存占用。来个小例子//g++ -o malloc_addr_vec mallc_addr_vec.cpp 编译2#include&lt;iostream&gt;3usingnamespacestd;4intmain(intargc,char*argv[])5{6intmalloc_size=atoi(argv[1]);7char</summary><published>2012-04-05T09:51:00Z</published><updated>2012-04-05T09:51:00Z</updated><author><name>大熊 | Zealot Yin</name><uri>http://www.cnblogs.com/Creator/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Creator/archive/2012/04/05/2433386.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Creator/archive/2012/04/05/2433386.html"/><content type="html">&lt;p&gt;&lt;span style="font-size: 18pt; "&gt;&lt;strong&gt;问题：&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space: pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;我们在写程序的时候经常发现程序使用的内存往往比我们申请的多，为了优化程序的内存占用，搅尽脑汁想要优化内存占用，可是发现自己的代码也无从优化了，怎么办？现在我们把我们的焦点放到malloc上，毕竟我们向系统申请的内存都是通过它完成了，不了解他，也就不能彻底的优化内存占用。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;来个小例子&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;font color="#008080"&gt;&lt;span style="font-size: 12pt"&gt;//&lt;/span&gt;&lt;/font&gt;&lt;span style="font-size: 12pt"&gt;g++ -o malloc_addr_vec &amp;nbsp;mallc_addr_vec.cpp 编译&lt;/span&gt;&lt;font color="#008080"&gt;&lt;br /&gt;&lt;/font&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;2&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;#include&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #0000ff"&gt;namespace&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;std;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;main(&lt;/span&gt;&lt;span style="font-size: 12pt; color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;argc,&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 12pt; color: #0000ff"&gt;char&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;*argv[])&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;5&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-size: 12pt; color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;malloc_size&amp;nbsp;=&amp;nbsp;atoi(argv[&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;1&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;]);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-size: 12pt; color: #0000ff"&gt;char&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;*&amp;nbsp;malloc_char;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-size: 12pt; color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;(size_t&amp;nbsp;i&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;0&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;1024&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;*&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;1024&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;;&amp;nbsp;++i)&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;9&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;malloc_char&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 12pt; color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #0000ff"&gt;char&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;[malloc_size];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;10&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;11&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-size: 12pt; color: #0000ff"&gt;while&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;1&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;)&amp;nbsp;{}&lt;/span&gt;&lt;span style="font-size: 12pt; color: #008000"&gt;//&lt;/span&gt;&lt;span style="font-size: 12pt; color: #008000"&gt;此时查看内存占用&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;12&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-size: 12pt; color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;0&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;13&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 12pt; line-height: 23px; font-family: song, Verdana; background-color: #ffffff"&gt;&amp;nbsp;本文的测试环境为Linux 64Bit ,使用G++编译为可执行文件后，使用不同的启动参数启动，使用top命令查看程序占用的内存，这里我们主要是看RES指标&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; line-height: 23px; font-family: song, Verdana; background-color: #ffffff"&gt;RES&amp;nbsp;&amp;nbsp;--&amp;nbsp;&amp;nbsp;Resident size (kb)&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size: 12pt; line-height: 23px; font-family: song, Verdana; background-color: #ffffff"&gt;The non-swapped physical memory a task has used.&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;测试案例：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;1.每次new 1 Byte &amp;nbsp; Do 1024*1024次&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;./malloc_addr_vec 1 &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;启动程序后的内存占用&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;img height="44" alt="" src="http://images.cnblogs.com/cnblogs_com/creator/blog_img/malloc_01.jpg" width="420" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;内存消耗 32MB&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;2.每次new 24 Byte &amp;nbsp;Do 1024*1024次&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;./malloc_addr_vec 24&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;启动程序后的内存占用 &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img height="46" alt="" src="http://images.cnblogs.com/cnblogs_com/creator/blog_img/malloc_02.jpg" width="417" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;内存消耗32MB&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;3.每次new 25 Byte &amp;nbsp; Do 1024*1024次 &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;./malloc_addr_vec 25&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size: 12pt"&gt;启动程序后的内存占用&amp;nbsp;&lt;/span&gt;&lt;p&gt;&amp;nbsp;&lt;img height="45" alt="" src="http://images.cnblogs.com/cnblogs_com/creator/blog_img/malloc_03.jpg" width="414" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;内存消耗48MB&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;为什么我们每次new 1Byte 和每次 new 24Byte系统消耗的内存一样呢？，为什么每次new 25Byte和 每次new 24Byte占用的内存完全不同呢？&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;不知道大家在写程序的时候有没有关注过这个问题。我一次遇到时，吐槽一句：What the fuck malloc.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18pt"&gt;&lt;strong&gt;原因分析：&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;在大多数情况下，编译器和C库透明地帮你处理对齐问题。POSIX 标明了通过malloc( ), calloc( ), 和 realloc( ) 返回的地址对于任何的C类型来说都是对齐的。&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size: 12pt"&gt;对齐参数（MALLOC_ALIGNMENT）&amp;nbsp;大小的设定并需满足两个特性 &lt;/span&gt;&lt;blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;1.必须是2的幂&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;2.必须是(void *)的整数倍&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;至于为什么会要求是(void *)的整数倍，这个目前我还不太清楚，等你来发现...&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;根据这个原理，在32位和64位的对齐单位分别为8字节和16字节&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;但是这并解释不了上面的测试结果，这是因为系统malloc分配的最小单位（MINSIZE）并不是对齐单位&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;为了进一步了解细节，从&lt;/span&gt;&lt;span style="font-size: 12pt; color: #333333; line-height: 26px; font-family: Arial; background-color: #ffffff; text-align: left"&gt;GNU网站中把glibc源码下载下来，查看其&lt;/span&gt; &lt;span style="font-size: 12pt; color: #333333; line-height: 26px; font-family: Arial; background-color: #ffffff; text-align: left"&gt;malloc.c文件&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('090fa6de-c124-4ecb-9548-a17e6045ad5b')"&gt;&lt;img class="code_img_closed" id="code_img_closed_090fa6de-c124-4ecb-9548-a17e6045ad5b" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" /&gt;&lt;img class="code_img_opened" id="code_img_opened_090fa6de-c124-4ecb-9548-a17e6045ad5b" style="display: none" onclick="cnblogs_code_hide('090fa6de-c124-4ecb-9548-a17e6045ad5b',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&lt;span class="cnblogs_code_collapse" style="font-size: 12pt"&gt;View Code &lt;/span&gt;&lt;div class="cnblogs_code_hide" id="cnblogs_code_open_090fa6de-c124-4ecb-9548-a17e6045ad5b"&gt;&lt;div&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;1&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;#ifndef&amp;nbsp;INTERNAL_SIZE_T&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #0000ff"&gt;#define&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;INTERNAL_SIZE_T&amp;nbsp;size_t&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #0000ff"&gt;#endif&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #0000ff"&gt;#define&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;SIZE_SZ&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(sizeof(INTERNAL_SIZE_T))&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;5&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;#ifndef&amp;nbsp;MALLOC_ALIGNMENT&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #0000ff"&gt;#define&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;MALLOC_ALIGNMENT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(2&amp;nbsp;*&amp;nbsp;SIZE_SZ)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #0000ff"&gt;#endif&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #0000ff"&gt;struct&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;malloc_chunk&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;11&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;INTERNAL_SIZE_T&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;prev_size;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 12pt; color: #008000"&gt;/*&lt;/span&gt;&lt;span style="font-size: 12pt; color: #008000"&gt;&amp;nbsp;Size&amp;nbsp;of&amp;nbsp;previous&amp;nbsp;chunk&amp;nbsp;(if&amp;nbsp;free).&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 12pt; color: #008000"&gt;*/&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;12&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;INTERNAL_SIZE_T&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;size;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 12pt; color: #008000"&gt;/*&lt;/span&gt;&lt;span style="font-size: 12pt; color: #008000"&gt;&amp;nbsp;Size&amp;nbsp;in&amp;nbsp;bytes,&amp;nbsp;including&amp;nbsp;overhead.&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 12pt; color: #008000"&gt;*/&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;13&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-size: 12pt; color: #0000ff"&gt;struct&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;malloc_chunk*&amp;nbsp;fd;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 12pt; color: #008000"&gt;/*&lt;/span&gt;&lt;span style="font-size: 12pt; color: #008000"&gt;&amp;nbsp;double&amp;nbsp;links&amp;nbsp;--&amp;nbsp;used&amp;nbsp;only&amp;nbsp;if&amp;nbsp;free.&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 12pt; color: #008000"&gt;*/&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;14&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-size: 12pt; color: #0000ff"&gt;struct&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;malloc_chunk*&amp;nbsp;bk;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;15&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;};&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;16&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;17&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;An&amp;nbsp;allocated&amp;nbsp;chunk&amp;nbsp;looks&amp;nbsp;like&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 12pt; color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;:&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;18&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;chunk-&amp;gt;&amp;nbsp;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;19&lt;/span&gt;&lt;span style="font-size: 12pt"&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;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Size&amp;nbsp;of&amp;nbsp;previous&amp;nbsp;chunk,&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 12pt; color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;allocated&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;20&lt;/span&gt;&lt;span style="font-size: 12pt"&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;&amp;nbsp;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;21&lt;/span&gt;&lt;span style="font-size: 12pt"&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;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Size&amp;nbsp;of&amp;nbsp;chunk,&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 12pt; color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;bytes&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|M|P|&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;22&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mem-&amp;gt;&amp;nbsp;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;23&lt;/span&gt;&lt;span style="font-size: 12pt"&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;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;User&amp;nbsp;data&amp;nbsp;starts&amp;nbsp;here...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;24&lt;/span&gt;&lt;span style="font-size: 12pt"&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;&amp;nbsp;.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;25&lt;/span&gt;&lt;span style="font-size: 12pt"&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;&amp;nbsp;.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(malloc_usable_size()&amp;nbsp;bytes)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;26&lt;/span&gt;&lt;span style="font-size: 12pt"&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;&amp;nbsp;.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;27&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;nextchunk-&amp;gt;&amp;nbsp;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;28&lt;/span&gt;&lt;span style="font-size: 12pt"&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;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Size&amp;nbsp;of&amp;nbsp;chunk&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;29&lt;/span&gt;&lt;span style="font-size: 12pt"&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;&amp;nbsp;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;30&lt;/span&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;&amp;nbsp;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;31&lt;/span&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;&amp;nbsp;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;32&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #0000ff"&gt;#define&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;MALLOC_ALIGN_MASK&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(MALLOC_ALIGNMENT&amp;nbsp;-&amp;nbsp;1)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;33&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #0000ff"&gt;#define&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;MIN_CHUNK_SIZE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(sizeof(struct&amp;nbsp;malloc_chunk))&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;34&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #0000ff"&gt;#define&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;MINSIZE&amp;nbsp;&amp;nbsp;/&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;35&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;(unsigned&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 12pt; color: #0000ff"&gt;long&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;)(((MIN_CHUNK_SIZE+MALLOC_ALIGN_MASK)&amp;nbsp;&amp;amp;&amp;nbsp;~MALLOC_ALIGN_MASK))&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;36&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #008000"&gt;/*&lt;/span&gt;&lt;span style="font-size: 12pt; color: #008000"&gt;&amp;nbsp;pad&amp;nbsp;request&amp;nbsp;bytes&amp;nbsp;into&amp;nbsp;a&amp;nbsp;usable&amp;nbsp;size&amp;nbsp;--&amp;nbsp;internal&amp;nbsp;version&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 12pt; color: #008000"&gt;*/&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;37&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #0000ff"&gt;#define&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;request2size(req)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;38&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;(((req)&amp;nbsp;+&amp;nbsp;SIZE_SZ&amp;nbsp;+&amp;nbsp;MALLOC_ALIGN_MASK&amp;nbsp;&amp;lt;&amp;nbsp;MINSIZE)&amp;nbsp;&amp;nbsp;?&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;39&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MINSIZE&amp;nbsp;:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;40&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((req)&amp;nbsp;+&amp;nbsp;SIZE_SZ&amp;nbsp;+&amp;nbsp;MALLOC_ALIGN_MASK)&amp;nbsp;&amp;amp;&amp;nbsp;~MALLOC_ALIGN_MASK)&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;其中request2size这个宏就是glibc的内存对齐操作，MINSIZE就是使用malloc时占用内存的最小单位。根据宏定义可推算在32位系统中MINSIZE为16字节，在64位系统中MINSIZE一般为32字节。从request2size还可以知道，如果是64位系统，申请内存为1~24字节时，系统内存消耗32字节，当申请内存为25字节时，系统内存消耗48字节。&lt;/span&gt;&lt;span style="font-size: 16px; line-height: 24px; "&gt;如果是32位系统，申请内存为1~12字节时，系统内存消耗16字节，当申请内存为13字节时，系统内存消耗24字节。&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px; line-height: 24px; "&gt;一般他们的差距是一个指针大小，计算公式是&lt;/span&gt;&lt;/p&gt;&lt;blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"&gt;&lt;p&gt;&lt;span style="line-height: 24px; font-size: 12pt; "&gt;max(&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;MINSIZE,&lt;/span&gt;&lt;span style="line-height: 24px; font-size: 12pt; "&gt;in_use_size)&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;其中&lt;/span&gt;&lt;span style="line-height: 24px; font-size: 12pt; "&gt;in_use_size=&lt;/span&gt;&lt;span style="line-height: 24px; font-size: 12pt; "&gt;(要求大小+2*指针大小-指针大小&lt;/span&gt;&lt;span style="line-height: 24px; font-size: 12pt; "&gt;)&lt;/span&gt;&lt;span style="line-height: 24px; font-size: 12pt; "&gt;align to&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;MALLOC_ALIGNMENT&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;(对于上面计算的由来可以参见&lt;/span&gt;&lt;a href="http://blog.csdn.net/unbutun/article/details/5827615"&gt;&lt;span style="font-size: 12pt; "&gt;glibc 内存池管理 ptmalloc&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 12pt; "&gt;这篇文章的第4节chuck部分以及搜一下malloc的内部实现源码&lt;/span&gt;&amp;nbsp;）&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;为了证明这个理论的正确性，我们需要计算一次malloc到底花掉了多少内存，我们用如下代码分别在32bit Linux和 64bit Linux上做测试&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;2&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;#include&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;3&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;#include&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;main()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;5&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-size: 12pt; color: #0000ff"&gt;char&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;*&amp;nbsp;p1;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-size: 12pt; color: #0000ff"&gt;char&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;*&amp;nbsp;p2;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-size: 12pt; color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;1&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;9&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800000"&gt;"&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800000"&gt;%d\n&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800000"&gt;"&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;,&lt;/span&gt;&lt;span style="font-size: 12pt; color: #0000ff"&gt;sizeof&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;(&lt;/span&gt;&lt;span style="font-size: 12pt; color: #0000ff"&gt;char&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;*));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;10&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-size: 12pt; color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;(;i&amp;lt;&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;100&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;;i++)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;11&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;12&lt;/span&gt;&lt;span style="font-size: 12pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p1=NULL;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;13&lt;/span&gt;&lt;span style="font-size: 12pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p2=NULL;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;14&lt;/span&gt;&lt;span style="font-size: 12pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p1=(&lt;/span&gt;&lt;span style="font-size: 12pt; color: #0000ff"&gt;char&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;*)malloc(i*&lt;/span&gt;&lt;span style="font-size: 12pt; color: #0000ff"&gt;sizeof&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;(&lt;/span&gt;&lt;span style="font-size: 12pt; color: #0000ff"&gt;char&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;15&lt;/span&gt;&lt;span style="font-size: 12pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p2=(&lt;/span&gt;&lt;span style="font-size: 12pt; color: #0000ff"&gt;char&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;*)malloc(&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;1&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;*&lt;/span&gt;&lt;span style="font-size: 12pt; color: #0000ff"&gt;sizeof&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;(&lt;/span&gt;&lt;span style="font-size: 12pt; color: #0000ff"&gt;char&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;16&lt;/span&gt;&lt;span style="font-size: 12pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800000"&gt;"&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800000"&gt;i=%d&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;%d\n&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800000"&gt;"&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;,i,(p2-p1));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;17&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;18&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;19&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;getchar();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;20&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;其测试结果如下：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;32bit&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('22bdf441-e659-478b-b59b-4205fdaccbfe')"&gt;&lt;img class="code_img_closed" id="code_img_closed_22bdf441-e659-478b-b59b-4205fdaccbfe" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" /&gt;&lt;img class="code_img_opened" id="code_img_opened_22bdf441-e659-478b-b59b-4205fdaccbfe" style="display: none" onclick="cnblogs_code_hide('22bdf441-e659-478b-b59b-4205fdaccbfe',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&lt;span class="cnblogs_code_collapse" style="font-size: 12pt"&gt;View Code &lt;/span&gt;&lt;div class="cnblogs_code_hide" id="cnblogs_code_open_22bdf441-e659-478b-b59b-4205fdaccbfe"&gt;&lt;div&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;&amp;nbsp;1&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;---------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;&amp;nbsp;2&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;Linux&amp;nbsp;&amp;nbsp;32bit&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;&amp;nbsp;3&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;---------------------&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;&amp;nbsp;5&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;16&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;&amp;nbsp;6&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;2&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;16&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;&amp;nbsp;7&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;3&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;16&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;&amp;nbsp;8&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;4&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;16&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;&amp;nbsp;9&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;5&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;16&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;10&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;6&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;16&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;11&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;7&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;16&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;12&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;8&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;16&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;13&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;9&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;16&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;14&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;16&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;15&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;11&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;16&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;16&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;12&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;16&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;17&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;13&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;24&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;18&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;14&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;24&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;19&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;15&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;24&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;20&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;16&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;24&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;21&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;17&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;24&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;22&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;18&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;24&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;23&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;19&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;24&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;24&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;20&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;24&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;25&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;21&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;26&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;22&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;27&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;23&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;28&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;24&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;29&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;25&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;30&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;26&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;31&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;27&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;32&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;28&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;33&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;29&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;40&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;34&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;30&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;40&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;35&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;31&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;40&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;36&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;40&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;37&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;33&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;40&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;38&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;34&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;40&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;39&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;35&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;40&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;40&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;36&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;40&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;41&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;37&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;48&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;42&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;38&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;48&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;43&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;39&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;48&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;44&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;40&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;48&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;45&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;41&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;48&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;46&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;42&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;48&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;47&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;43&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;48&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;48&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;44&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;48&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;49&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;45&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;56&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;50&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;46&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;56&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;51&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;47&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;56&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;52&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;48&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;56&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;53&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;49&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;56&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;54&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;50&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;56&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;55&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;51&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;56&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;56&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;52&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;56&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;57&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;53&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;64&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;58&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;54&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;64&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;59&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;55&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;64&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;60&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;56&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;64&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;61&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;57&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;64&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;62&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;58&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;64&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;63&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;59&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;64&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;64&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;60&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;64&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;65&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;61&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;72&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;66&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;62&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;72&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;67&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;63&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;72&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;68&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;64&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;72&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;69&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;65&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;72&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;70&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;66&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;72&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;71&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;67&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;72&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;72&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;68&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;72&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;73&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;69&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;80&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;74&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;70&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;80&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;75&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;71&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;80&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;76&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;72&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;80&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;77&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;73&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;80&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;78&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;74&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;80&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;79&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;75&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;80&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;80&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;76&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;80&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;81&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;77&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;88&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;82&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;78&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;88&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;83&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;79&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;88&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;84&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;80&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;88&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;85&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;81&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;88&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;86&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;82&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;88&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;87&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;83&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;88&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;88&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;84&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;88&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;89&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;85&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;96&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;90&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;86&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;96&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;91&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;87&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;96&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;92&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;88&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;96&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;93&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;89&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;96&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;94&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;90&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;96&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;95&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;91&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;96&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;96&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;92&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;96&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;97&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;93&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;104&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;98&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;94&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;104&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;99&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;95&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;104&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;100&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;96&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;104&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;101&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;97&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;104&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;102&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;98&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;104&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;103&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;99&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;104&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;64bit&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('3e5f8186-e01e-4330-b0a8-f9bc514eefb0')"&gt;&lt;img class="code_img_closed" id="code_img_closed_3e5f8186-e01e-4330-b0a8-f9bc514eefb0" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" /&gt;&lt;img class="code_img_opened" id="code_img_opened_3e5f8186-e01e-4330-b0a8-f9bc514eefb0" style="display: none" onclick="cnblogs_code_hide('3e5f8186-e01e-4330-b0a8-f9bc514eefb0',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&lt;span class="cnblogs_code_collapse" style="font-size: 12pt"&gt;View Code &lt;/span&gt;&lt;div class="cnblogs_code_hide" id="cnblogs_code_open_3e5f8186-e01e-4330-b0a8-f9bc514eefb0"&gt;&lt;div&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;&amp;nbsp;1&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;-------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;&amp;nbsp;2&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;Linux&amp;nbsp;&amp;nbsp;64bit&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;&amp;nbsp;3&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;-------------------&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;8&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;&amp;nbsp;5&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;&amp;nbsp;6&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;2&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;&amp;nbsp;7&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;3&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;&amp;nbsp;8&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;4&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;&amp;nbsp;9&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;5&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;10&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;6&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;11&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;7&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;12&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;8&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;13&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;9&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;14&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;15&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;11&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;16&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;12&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;17&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;13&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;18&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;14&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;19&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;15&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;20&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;16&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;21&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;17&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;22&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;18&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;23&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;19&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;24&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;20&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;25&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;21&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;26&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;22&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;27&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;23&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;28&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;24&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;29&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;25&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;48&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;30&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;26&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;48&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;31&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;27&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;48&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;32&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;28&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;48&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;33&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;29&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;48&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;34&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;30&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;48&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;35&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;31&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;48&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;36&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;32&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;48&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;37&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;33&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;48&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;38&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;34&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;48&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;39&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;35&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;48&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;40&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;36&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;48&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;41&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;37&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;48&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;42&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;38&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;48&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;43&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;39&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;48&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;44&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;40&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;48&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;45&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;41&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;64&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;46&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;42&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;64&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;47&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;43&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;64&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;48&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;44&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;64&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;49&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;45&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;64&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;50&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;46&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;64&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;51&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;47&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;64&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;52&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;48&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;64&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;53&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;49&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;64&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;54&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;50&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;64&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;55&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;51&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;64&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;56&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;52&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;64&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;57&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;53&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;64&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;58&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;54&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;64&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;59&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;55&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;64&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;60&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;56&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;64&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;61&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;57&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;80&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;62&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;58&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;80&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;63&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;59&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;80&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;64&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;60&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;80&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;65&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;61&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;80&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;66&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;62&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;80&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;67&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;63&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;80&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;68&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;64&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;80&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;69&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;65&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;80&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;70&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;66&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;80&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;71&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;67&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;80&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;72&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;68&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;80&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;73&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;69&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;80&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;74&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;70&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;80&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;75&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;71&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;80&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;76&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;72&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;80&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;77&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;73&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;96&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;78&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;74&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;96&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;79&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;75&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;96&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;80&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;76&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;96&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;81&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;77&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;96&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;82&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;78&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;96&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;83&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;79&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;96&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;84&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;80&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;96&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;85&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;81&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;96&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;86&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;82&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;96&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;87&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;83&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;96&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;88&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;84&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;96&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;89&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;85&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;96&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;90&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;86&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;96&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;91&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;87&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;96&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;92&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;88&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;96&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;93&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;89&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;112&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;94&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;90&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;112&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;95&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;91&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;112&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;96&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;92&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;112&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;97&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;93&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;112&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;98&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;94&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;112&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;&amp;nbsp;99&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;95&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;112&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;100&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;96&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;112&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;101&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;97&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;112&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;102&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;98&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;112&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12pt; color: #008080"&gt;103&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-size: 12pt; color: #800080"&gt;99&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 12pt; color: #800080"&gt;112&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;了解了malloc的内存对其原理后，对于程序的内存占用的优化又有了有的放矢。我们可以根据内存对齐的原则来请求内存，来制作我们的高效内存池，从而避免隐形的资源浪费.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;例如，目前STL的内存池是以8Byte为对齐单位，内存池free_list大小为&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp; free_list[0] --------&amp;gt; 8 byte&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp;&amp;nbsp;free_list[1] --------&amp;gt; 16 byte&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp; free_list[2] --------&amp;gt; 24 byte&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp; free_list[3] --------&amp;gt; 32 byte&lt;/span&gt;&lt;br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp;&amp;nbsp;... ...&lt;/span&gt;&lt;br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="background-color: #ffffff; font-family: 微软雅黑; line-height: normal; font-size: 12pt; "&gt;&amp;nbsp; free_list[15] -------&amp;gt; 128 byte&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;STL内存池在发现某个规则的内存用完了时，会进行refill,在进行&lt;/span&gt;&lt;span style="background-color: #ffffff; font-family: 微软雅黑; line-height: normal; font-size: 12pt; "&gt;chunk_alloc&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;例如8Byte大小的空间没有了，调用refill,refill会将其空间准备20个,也就是20*8，当然refill做不了内存分配，他把20个8Byte的需求提交给&lt;/span&gt;&lt;span style="font-family: 微软雅黑; line-height: normal; background-color: #ffffff; font-size: 12pt; "&gt;chunk_alloc&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 微软雅黑; line-height: normal; background-color: #ffffff; font-size: 12pt; "&gt;chunk_alloc&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp;能真正分配内存，但是它分配的时候会将内存空间*2，所以最终malloc的内存为8*20*2=320&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp;，32bit系统给malloc的内存为328,64bit系统给malloc的内存为336&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;在32位和64位操作系统分别浪费掉8Byte和16Byte,其实我们可以在chunk_alloc内部简单的计算一下系统的内存对齐，达到 chunk_alloc 级零浪费...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;至于 allocate级别的浪费，我想是避免不了了，譬如，我需要一个6Byte的空间，STL内存池给我的确实8Byte&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;参考资料：&lt;a href="http://blog.csdn.net/elpmis/article/details/4500917"&gt;http://blog.csdn.net/elpmis/article/details/4500917&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Creator/aggbug/2433386.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Creator/archive/2012/04/05/2433386.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Creator/archive/2012/03/30/2426070.html</id><title type="text">如何实现文件增量同步——算法</title><summary type="text">问题：如何增量同步文件，例如一个文本文件有10M，分别存放在A，B两个地方，现在两个文件是完全一样的，但是我马上要在A上对这个文件进行修改，B如何实现自动和A上的文件保持一致，并且网络的传输量最少。应用场景：这样的使用场景太多，这里随便列举几个1.A机器为线上运营的机器，现在需要一台备份的机器B，当A发生宕机的时候，或者硬盘损坏等各种认为非人为原因导致数据不可用时，可以很快从B恢复2.SVN这样的应用场景，不需要每次修改都向服务器发送并替换掉一个文件，而是只发送被修改的部分3.手机客户端对一个文本修改，如果那个文本有2M，难道我每次更新都需要上传整个文件吗？每次2M，傻子才用!等等</summary><published>2012-03-30T14:22:00Z</published><updated>2012-03-30T14:22:00Z</updated><author><name>大熊 | Zealot Yin</name><uri>http://www.cnblogs.com/Creator/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Creator/archive/2012/03/30/2426070.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Creator/archive/2012/03/30/2426070.html"/><content type="html">&lt;p&gt;&lt;span style="font-size: 18pt; "&gt;&lt;strong&gt;问题：&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;如何增量同步文件，例如一个文本文件有10M，分别存放在A，B两个地方，现在两个文件是完全一样的，但是我马上要在A上对这个文件进行修改，B如何实现自动和A上的文件保持一致，并且网络的传输量最少。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18pt; "&gt;&lt;strong&gt;应用场景：&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;这样的使用场景太多，这里随便列举几个&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;1.A机器为线上运营的机器，现在需要一台备份的机器B，当A发生宕机的时候，或者硬盘损坏等各种认为非人为原因导致数据不可用时，可以很快从B恢复&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;2.SVN这样的应用场景，不需要每次修改都向服务器发送并替换掉一个文件，而是只发送被修改的部分&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;3.手机客户端对一个文本修改，如果那个文本有2M，难道我每次更新都需要上传整个文件吗？每次2M，傻子才用!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;等等....&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18pt; "&gt;&lt;strong&gt;解决方案：&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;&lt;strong&gt;一&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;&lt;strong&gt;.分而治之&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;计算机最重要的基本算法思路就是分而治之，在我们眼里，一个文件不是一个文件，而是一堆存储块，每个存储块可能20Byte大小，至于这个值具体多大，你可以自己设定,这里的20Byte仅提供参考。通过这样的方法，一个文件被分成了很多个块，我们只需要比对块是否相同就可以得出哪个部分做了相应修改。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;&lt;strong&gt;二&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;&lt;strong&gt;.快速校验&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;刚上面提到如何比对文件，当然这里肯定不会把文件的每个块上传去比对，那样做就没有意义了。快速比对这不禁让我想起了哈希规则，哈希表可以通过O（1）的复杂度查找某个key，为什么？ &amp;nbsp;因为它通过计算hash值来初步验证key，一个key的hash值是唯一的。但是仅仅验证hash值是不可靠的，因为hash值有可能会冲突，所以在验证完hash值后，我们在进行key的比较来确定要找的值...&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;通过哈希的思路，我们可以使用类似的方法来实现文件增量同步，把每一个存储块，通过MD5计算其值，然后传递MD5值到服务器，让服务器比对MD5来确定有没有被修改，如若MD5值不相等，则判定这个文件块有被修改过&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;为什么是MD5？&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;1）能够将任意长度的字符串转换为128位定长字符串（MD5 16)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;2）MD5能够保证绝大部分情况下不同的值hash之后其hash值不一样，哈希冲突比较少&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;这样就可以了吗？&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;No,MD5的生成需要占用比较长的CPU时间，所以我们需要寻找一种更简洁的校验方式，这里选用&lt;/span&gt;&lt;span style="background-color: #ffffff; font-family: Arial; line-height: 26px; text-align: left; font-size: 12pt; "&gt;Alder32&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp;是一个比较通用的解决方案&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;span style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;Alder32有两个优点：&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;1、计算非常快，比MD5快多了，成本小；&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;2、当我们有了从0-k长度的校验和后，计算出1-k或者2-k等其他校验和非常方便，只要少量运算即可。(k可以理解为上面的20Byte)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre; font-size: 12pt; "&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;当然，它的缺点也很明显，就是碰撞率比MD5高多了，所以，我们客户端需要同时计算出Alder32校验和与MD5值，传给服务器，而服务器，为了节省CPU时间，第一步只生成Alder32进行校验，当值相等时，在进行MD5校验，这样服务器就节省了很大的开支。&lt;/span&gt;&lt;/div&gt;&lt;p&gt;Alder32&lt;span style="font-size: 12pt; "&gt;算法实现：&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;A&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080; font-size: 10pt; "&gt;1&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;+&amp;nbsp;D1&amp;nbsp;+&amp;nbsp;D2&amp;nbsp;+&amp;nbsp;...&amp;nbsp;+&amp;nbsp;Dn&amp;nbsp;(mod&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080; font-size: 10pt; "&gt;65521&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;B&amp;nbsp;=&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #800080; font-size: 10pt; "&gt;1&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;+&amp;nbsp;D1)&amp;nbsp;+&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #800080; font-size: 10pt; "&gt;1&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;+&amp;nbsp;D1&amp;nbsp;+&amp;nbsp;D2)&amp;nbsp;+&amp;nbsp;...&amp;nbsp;+&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #800080; font-size: 10pt; "&gt;1&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;+&amp;nbsp;D1&amp;nbsp;+&amp;nbsp;D2&amp;nbsp;+&amp;nbsp;...&amp;nbsp;+&amp;nbsp;Dn)&amp;nbsp;(mod&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080; font-size: 10pt; "&gt;65521&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;n&amp;#215;D1&amp;nbsp;+&amp;nbsp;(n&amp;#8722;&lt;/span&gt;&lt;span style="color: #800080; font-size: 10pt; "&gt;1&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;)&amp;#215;D2&amp;nbsp;+&amp;nbsp;(n&amp;#8722;&lt;/span&gt;&lt;span style="color: #800080; font-size: 10pt; "&gt;2&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;)&amp;#215;D3&amp;nbsp;+&amp;nbsp;...&amp;nbsp;+&amp;nbsp;Dn&amp;nbsp;+&amp;nbsp;n&amp;nbsp;(mod&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080; font-size: 10pt; "&gt;65521&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;Adler-&lt;/span&gt;&lt;span style="color: #800080; font-size: 10pt; "&gt;32&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;(D)&amp;nbsp;=&amp;nbsp;B&amp;nbsp;&amp;#215;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080; font-size: 10pt; "&gt;65536&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;+&amp;nbsp;A&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;C实现版本&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff; font-size: 10pt; "&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff; font-size: 10pt; "&gt;int&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;MOD_ADLER&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080; font-size: 10pt; "&gt;65521&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-size: 10pt; "&gt;unsigned&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; font-size: 10pt; "&gt;long&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;adler32(unsigned&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; font-size: 10pt; "&gt;char&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;*data,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; font-size: 10pt; "&gt;int&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;len)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; font-size: 10pt; "&gt;/*&lt;/span&gt;&lt;span style="color: #008000; font-size: 10pt; "&gt;&amp;nbsp;where&amp;nbsp;data&amp;nbsp;is&amp;nbsp;the&amp;nbsp;location&amp;nbsp;of&amp;nbsp;the&amp;nbsp;data&amp;nbsp;in&amp;nbsp;physical&amp;nbsp;memory&amp;nbsp;and&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000; font-size: 10pt; "&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;len&amp;nbsp;is&amp;nbsp;the&amp;nbsp;length&amp;nbsp;of&amp;nbsp;the&amp;nbsp;data&amp;nbsp;in&amp;nbsp;bytes&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; font-size: 10pt; "&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; "&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; font-size: 10pt; "&gt;long&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;a&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080; font-size: 10pt; "&gt;1&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;,&amp;nbsp;b&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080; font-size: 10pt; "&gt;0&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff; font-size: 10pt; "&gt;int&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;index;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000; font-size: 10pt; "&gt;/*&lt;/span&gt;&lt;span style="color: #008000; font-size: 10pt; "&gt;&amp;nbsp;Process&amp;nbsp;each&amp;nbsp;byte&amp;nbsp;of&amp;nbsp;the&amp;nbsp;data&amp;nbsp;in&amp;nbsp;order&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; font-size: 10pt; "&gt;*/&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff; font-size: 10pt; "&gt;for&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;(index&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080; font-size: 10pt; "&gt;0&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;;&amp;nbsp;index&amp;nbsp;&amp;lt;&amp;nbsp;len;&amp;nbsp;++index)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a&amp;nbsp;=&amp;nbsp;(a&amp;nbsp;+&amp;nbsp;data[index])&amp;nbsp;%&amp;nbsp;MOD_ADLER;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b&amp;nbsp;=&amp;nbsp;(b&amp;nbsp;+&amp;nbsp;a)&amp;nbsp;%&amp;nbsp;MOD_ADLER;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff; font-size: 10pt; "&gt;return&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;(b&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080; font-size: 10pt; "&gt;16&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;)&amp;nbsp;|&amp;nbsp;a;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; "&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;&lt;strong&gt;三.实现更改&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;因为已经找出来了文件不同的地方，所以只需要按需上传更改的部分到服务器，然后服务器做更改就可以了。&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="font-size: 18pt; "&gt;实例分析：&lt;/strong&gt;&lt;span style="font-size: 18pt; "&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;理论概述完毕，来点小例子子&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;客户端文件内容是：&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;strong style="background-color: #ffffff; font-family: Arial; line-height: 26px; text-align: left; "&gt;&lt;span style="color: #ff0000; font-size: 12pt; "&gt;taohuiissoman&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;而服务器的文件内容是：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000; font-size: 12pt; "&gt;itaohuiamsoman&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;strong style="background-color: #ffffff; font-family: Arial; line-height: 26px; text-align: left; "&gt;&lt;span style="color: #ff0000; "&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;首先，客户端开始分块并计算出MD5和Alder32值。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/creator/blog_img/2426070_1.gif" width="523" height="248" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;如上图，像taoh是一块，对taoh分别计算出MD5和alder32值。以此类推，最后一个n字母不足4位保留。于是，客户端把计算出的MD5和alder32按顺序发出，最后发出字符n。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;服务器收到后，先把自己保存的File.2的内容按4字节划分。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/creator/blog_img/2426070_2.gif" width="534" height="261" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;划分出itao、huia、msom、an，当然，这些串的Alder32值肯定无法从File.1里划分出的：taoh、uiis、soma、n找出相同的。于是向后移一个字节，从t开始继续按4字节划分。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/creator/blog_img/2426070_3.gif" width="634" height="261" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;从taoh上找到了alder32相同的块，接着再比较MD5值，也相同！于是记下来，跳过taoh这4个字符，看uiam，又找不到File.1上相同的块了。继续向后跳1个字节从i开始看。还是没有找到Alder32相同，继续向后移，以此类推。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/creator/blog_img/2426070_4.gif" width="634" height="277" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;到了soma，又找到相同的块了。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;重复上面的步骤，直到File.2文件结束。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="font-size: 12pt; "&gt;通过这个简单的例子，可以设想一下其他任何的增删查改功能&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000; "&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;参考资料：&lt;/span&gt;&lt;a href="http://cs.anu.edu.au/techreports/1996/TR-CS-96-05.pdf"&gt;&lt;span style="font-size: 12pt; "&gt;http://cs.anu.edu.au/techreports/1996/TR-CS-96-05.pdf&lt;/span&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Creator/aggbug/2426070.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Creator/archive/2012/03/30/2426070.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Creator/archive/2012/03/21/2408413.html</id><title type="text">如何正确的终止正在运行的子线程</title><summary type="text">最近开发一些东西，线程数非常之多，当用户输入Ctrl+C的情形下，默认的信号处理会把程序退出，这时有可能会有很多线程的资源没有得到很好的释放，造成了内存泄露等等诸如此类的问题，本文就是围绕着这么一个使用场景讨论如何正确的终止正在运行的子线程。其实本文更确切的说是解决如何从待终止线程外部安全的终止正在运行的线程首先我们来看一下，让当前正在运行的子线程停止的所有方法1.任何一个线程调用exit2.pthread_exit3.pthread_kill4.pthread_cancel下面我们一一分析各种终止正在运行的程序的方法任何一个线程调用exit任何一个线程只要调用了exit都会导致进程结束，..</summary><published>2012-03-21T15:08:00Z</published><updated>2012-03-21T15:08:00Z</updated><author><name>大熊 | Zealot Yin</name><uri>http://www.cnblogs.com/Creator/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Creator/archive/2012/03/21/2408413.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Creator/archive/2012/03/21/2408413.html"/><content type="html">&lt;p&gt;&lt;span style="font-family: Comic Sans MS; font-size: 12pt"&gt;最近开发一些东西，线程数非常之多，当用户输入Ctrl+C的情形下，默认的信号处理会把程序退出，这时有可能会有很多线程的资源没有得到很好的释放，造成了内存泄露等等诸如此类的问题，本文就是围绕着这么一个使用场景讨论如何正确的终止正在运行的子线程。其实本文更确切的说是解决&lt;/span&gt;&lt;strong style="font-family: Comic Sans MS; font-size: 12pt"&gt;如何从待终止线程外部安全的终止正在运行的线程&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Comic Sans MS; font-size: 12pt"&gt;首先我们来看一下，让当前正在运行的子线程停止的所有方法&lt;/span&gt;&lt;/p&gt;&lt;blockquote style="margin-right: 0px" dir="ltr"&gt;&lt;p&gt;&lt;strong style="font-family: Comic Sans MS; font-size: 12pt"&gt;1.任何一个线程调用exit&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style="font-family: Comic Sans MS; font-size: 12pt"&gt;2.pthread_exit&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style="font-family: Comic Sans MS; font-size: 12pt"&gt;3.pthread_kill&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style="font-family: Comic Sans MS; font-size: 12pt"&gt;4.pthread_cancel&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Comic Sans MS; font-size: 12pt"&gt;下面我们一一分析各种终止正在运行的程序的方法&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="font-family: Comic Sans MS; font-size: 18pt"&gt;任何一个线程调用exit&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Comic Sans MS; font-size: 12pt"&gt;任何一个线程只要调用了exit都会导致进程结束，各种子线程当然也能很好的结束了，可是这种退出会有一个资源释放的问题.我们知道当一个进程终止时，内核对该进程所有尚未关闭的文件描述符调用close关闭，所以即使用户程序不调用close，在终止时内核也会自动关闭它打开的所有文件。没错，标准C++ IO流也会很好的在exit退出时得到flush并且释放资源，这些东西并不会造成资源的浪费（系统调用main函数入口类似于exit(main(argc,argv))).&lt;s&gt;表面上似乎所有的问题都能随着进程的结束来得到很好的处理，其实并不然，我们程序从堆上分配的内存就不能得到很好的释放，如new ,delete后的存储空间，这些空间进程结束并不会帮你把这部分内存归还给内存.&lt;/s&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;(本文初稿时，因基础不牢固，此处写错，事实上无论进程这样结束，系统都将会释放掉所有代码所申请的资源，无论是堆上的还是栈上的。（感谢ZKey的指导）。这种结束所有线程（包括主线程）的方式实际上在很多时候是非常可取的，但是对于针对关闭时进行一些别的逻辑的处理（指非资源释放逻辑）就不会很好，例如我想在程序被kill掉之前统计一下完成了多少的工作，这个统计类似于MapReduce，需要去每个线程获取，并且最后归并程一个统一的结果等等场景）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Comic Sans MS; font-size: 18pt"&gt;&lt;strong&gt;pthread_exit&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Comic Sans MS; font-size: 12pt"&gt;此函数的使用场景是当前运行的线程运行pthread_exit得到退出，对于各个子线程能够清楚地知道自己在什么时候结束的情景下，非常好用，可是实际上往往很多时候一个线程不能知道知道在什么时候该结束，例如遭遇Ctrl+C时,kill进程时，当然如果排除所有的外界干扰的话，那就让每个线程干完自己的事情后，然后自觉地乖乖的调用pthread_exit就可以了，这并不是本文需要讨论的内容，本文的情景就是讨论如何处理特殊情况。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Comic Sans MS; font-size: 12pt"&gt;这里还有一种方法，既然子线程可以通过pthread_exit来正确退出，那么我们可以在遭遇Ctrl+C时,kill进程时处理signal信号，然后分别给在某一个线程可以访问的公共区域存上一个flag变量，线程内部每运行一段时间（很短）来检查一下flag，若发现需要终止自己时，自己调用pthread_exit，此法有一个弱点就是当子线程需要进行阻塞的操作时，可能无暇顾及检查flag，例如socket阻塞操作。如果你的子线程的任务基本没有非阻塞的函数，那么这么干也不失为一种很好的方案。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18pt"&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Comic Sans MS; font-size: 18pt"&gt;&lt;strong&gt;pthread_kill&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18pt"&gt;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 12pt"&gt;不要被这个可怕的邪恶的名字所吓倒，其实pthread_kill并不像他的名字那样威力大，使用之后，你会感觉，他徒有虚名而已&lt;/span&gt;&lt;img alt="" src="http://www.cnblogs.com/Emoticons/qface/055611161.gif" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Comic Sans MS; font-size: 12pt"&gt;pthread_kill的职责其实只是向指定的线程发送signal信号而已，并没有真正的kill掉一个线程，当然这里需要说明一下，有些信号的默认行为就是exit，那此时你使用pthread_kill发送信号给目标线程，目标线程会根据这个信号的默认行为进行操作，有可能是exit。当然我们同时也可以更改获取某个信号的行为，以此来达到我们终止子线程的目的。&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;#define&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;_MULTI_THREADED&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;2&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;#include&amp;nbsp;&amp;lt;pthread.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;3&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;#include&amp;nbsp;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;4&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;#include&amp;nbsp;&amp;lt;signal.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;5&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;#include&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;check.h&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;#define&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;NUMTHREADS&amp;nbsp;3&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;void&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;sighand(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;int&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;signo);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;void&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;*threadfunc(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;void&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;*parm)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;11&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;12&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;pthread_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self&amp;nbsp;=&amp;nbsp;pthread_self();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;13&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;pthread_id_np_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tid;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;14&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;int&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rc;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;15&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;16&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;pthread_getunique_np(&amp;amp;self,&amp;nbsp;&amp;amp;tid);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;17&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;Thread&amp;nbsp;0x%.8x&amp;nbsp;%.8x&amp;nbsp;entered\n&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;,&amp;nbsp;tid);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;18&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;errno&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;0&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;19&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;rc&amp;nbsp;=&amp;nbsp;sleep(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;30&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;20&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;if&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;(rc&amp;nbsp;!=&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;0&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;errno&amp;nbsp;==&amp;nbsp;EINTR)&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;21&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;Thread&amp;nbsp;0x%.8x&amp;nbsp;%.8x&amp;nbsp;got&amp;nbsp;a&amp;nbsp;signal&amp;nbsp;delivered&amp;nbsp;to&amp;nbsp;it\n&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;22&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;tid);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;23&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;return&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;NULL;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;24&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;25&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;Thread&amp;nbsp;0x%.8x&amp;nbsp;%.8x&amp;nbsp;did&amp;nbsp;not&amp;nbsp;get&amp;nbsp;expected&amp;nbsp;results!&amp;nbsp;rc=%d,&amp;nbsp;errno=%d\n&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;26&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tid,&amp;nbsp;rc,&amp;nbsp;errno);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;27&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;return&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;NULL;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;28&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;29&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;30&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;int&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;main(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;int&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;argc,&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;char&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;**argv)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;31&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;32&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;int&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rc;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;33&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;int&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;34&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;struct&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;sigaction&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;actions;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;35&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;pthread_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;threads[NUMTHREADS];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;36&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;37&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;Enter&amp;nbsp;Testcase&amp;nbsp;-&amp;nbsp;%s\n&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;,&amp;nbsp;argv[&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;0&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;]);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;38&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;39&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;Set&amp;nbsp;up&amp;nbsp;the&amp;nbsp;alarm&amp;nbsp;handler&amp;nbsp;for&amp;nbsp;the&amp;nbsp;process\n&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;40&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;memset(&amp;amp;actions,&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;0&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;sizeof&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;(actions));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;41&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;sigemptyset(&amp;amp;actions.sa_mask);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;42&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;actions.sa_flags&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;0&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;43&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;actions.sa_handler&amp;nbsp;=&amp;nbsp;sighand;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;44&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;45&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;rc&amp;nbsp;=&amp;nbsp;sigaction(SIGALRM,&amp;amp;actions,NULL);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;46&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;checkResults(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;sigaction\n&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;,&amp;nbsp;rc);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;47&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;48&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;for&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;(i=&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;0&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;;&amp;nbsp;i&amp;lt;NUMTHREADS;&amp;nbsp;++i)&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;49&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rc&amp;nbsp;=&amp;nbsp;pthread_create(&amp;amp;threads[i],&amp;nbsp;NULL,&amp;nbsp;threadfunc,&amp;nbsp;NULL);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;50&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;checkResults(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;pthread_create()\n&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;,&amp;nbsp;rc);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;51&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;52&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;53&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;sleep(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;3&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;54&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;for&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;(i=&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;0&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;;&amp;nbsp;i&amp;lt;NUMTHREADS;&amp;nbsp;++i)&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;55&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rc&amp;nbsp;=&amp;nbsp;pthread_kill(threads[i],&amp;nbsp;SIGALRM);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;56&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;checkResults(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;pthread_kill()\n&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;,&amp;nbsp;rc);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;57&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;58&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;59&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;for&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;(i=&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;0&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;;&amp;nbsp;i&amp;lt;NUMTHREADS;&amp;nbsp;++i)&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;60&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rc&amp;nbsp;=&amp;nbsp;pthread_join(threads[i],&amp;nbsp;NULL);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;61&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;checkResults(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;pthread_join()\n&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;,&amp;nbsp;rc);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;62&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;63&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;Main&amp;nbsp;completed\n&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;64&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;0&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;65&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;66&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;67&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;void&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;sighand(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;int&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;signo)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;68&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;69&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;pthread_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self&amp;nbsp;=&amp;nbsp;pthread_self();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;70&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;pthread_id_np_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tid;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;71&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;72&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;pthread_getunique_np(&amp;amp;self,&amp;nbsp;&amp;amp;tid);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;73&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;Thread&amp;nbsp;0x%.8x&amp;nbsp;%.8x&amp;nbsp;in&amp;nbsp;signal&amp;nbsp;handler\n&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;74&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tid);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;75&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;return&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;76&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Comic Sans MS; font-size: 12pt"&gt;&amp;nbsp;运行输出为：&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;1&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;Output:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;3&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;Enter&amp;nbsp;Testcase&amp;nbsp;-&amp;nbsp;QP0WTEST/TPKILL0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;4&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;Set&amp;nbsp;up&amp;nbsp;the&amp;nbsp;alarm&amp;nbsp;handler&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;for&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;the&amp;nbsp;process&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;5&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;Thread&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;0x00000000&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;0000000c&amp;nbsp;entered&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;6&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;Thread&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;0x00000000&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;0000000d&amp;nbsp;entered&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;7&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;Thread&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;0x00000000&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;0000000e&amp;nbsp;entered&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;8&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;Thread&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;0x00000000&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;0000000c&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;in&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;signal&amp;nbsp;handler&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;9&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;Thread&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;0x00000000&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;0000000c&amp;nbsp;got&amp;nbsp;a&amp;nbsp;signal&amp;nbsp;delivered&amp;nbsp;to&amp;nbsp;it&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;10&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;Thread&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;0x00000000&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;0000000d&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;in&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;signal&amp;nbsp;handler&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;11&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;Thread&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;0x00000000&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;0000000d&amp;nbsp;got&amp;nbsp;a&amp;nbsp;signal&amp;nbsp;delivered&amp;nbsp;to&amp;nbsp;it&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;12&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;Thread&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;0x00000000&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;0000000e&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;in&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;signal&amp;nbsp;handler&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;13&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;Thread&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;0x00000000&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;0000000e&amp;nbsp;got&amp;nbsp;a&amp;nbsp;signal&amp;nbsp;delivered&amp;nbsp;to&amp;nbsp;it&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;14&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;Main&amp;nbsp;completed&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: Comic Sans MS; font-size: 12pt"&gt;我们可以通过截获的signal信号，来释放掉线程申请的资源，可是遗憾的是我们不能再signal处理里调用pthread_exit来终结掉线程，因为pthread_exit是中介当前线程，而signal被调用的方式可以理解为内核的回调，不是在同一个线程运行的，所以这里只能做处理释放资源的事情，线程内部只有判断有没有被中断（一般是EINTR）来断定是否要求自己结束，判定后可以调用pthread_exit退出。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Comic Sans MS; font-size: 12pt"&gt;&amp;nbsp;此法对于一般的操作也是非常可行的，可是在有的情况下就不是一个比较好的方法了，比如我们有一些线程在处理网络IO事件，假设它是一种一个客户端对应一个服务器线程，阻塞从Socket中读消息的情况。我们一般在网络IO的库里面回家上对EINTR信号的处理，例如recv时发现返回值小于0，检查error后，会进行他对应的操作。有可能他会再recv一次，那就相当于我的线程根本就不回终止,因为网络IO的类有可能不知道在获取EINTR时要终止线程。也就是说这不是一个特别好的可移植方案，如果你线程里的操作使用了很多外来的不太熟悉的类，而且你并不是他对EINTR的处理手段是什么，这是你在使用这样的方法来终止就有可能出问题了。而且如果你不是特别熟悉这方面的话你会很苦恼，&amp;#8220;为什么我的测试代码全是ok的，一加入你们部门开发的框架进来就不ok了，肯定是你们框架出问题了&amp;#8221;。好了，为了不必要的麻烦，我最后没有使用这个方案。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Comic Sans MS; font-size: 18pt"&gt;&lt;strong&gt;pthread_cancel&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Comic Sans MS; font-size: 12pt"&gt;这个方案是我最终采用的方案，我认为是解决这个问题，通用的最好的解决方案，虽然前面其他方案的有些问题他可能也不好解决，但是相比较而言，还是相当不错的&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Comic Sans MS; font-size: 12pt"&gt;pthread_cancel可以单独使用，因为在很多系统函数里面本身就有很多的断点，当调用这些系统函数时就会命中其内部的断点来结束线程，如下面的代码中，&lt;/span&gt;&lt;strong style="font-family: Comic Sans MS; font-size: 12pt"&gt;即便注释掉我们自己设置的断点&lt;/strong&gt;&lt;font color="#008000"&gt;&lt;strong&gt;pthread_testcancel()&lt;/strong&gt;&lt;span style="color: #000000"&gt;&lt;strong&gt;程序还是一样的会被成功的cancel掉，因为printf函数内部有取消点&lt;/strong&gt;（如果大家想了解更多的函数的取消点情况，可以阅读《Unix高级环境编程》的线程部分）&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 12pt"&gt;&amp;nbsp;1&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;#include&amp;nbsp;&amp;lt;pthread.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;2&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;#include&amp;nbsp;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;3&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;#include&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;4&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;#include&amp;nbsp;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;void&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;*threadfunc(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;void&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;*parm)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;6&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;7&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;Entered&amp;nbsp;secondary&amp;nbsp;thread\n&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;while&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;1&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;)&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;9&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;Secondary&amp;nbsp;thread&amp;nbsp;is&amp;nbsp;looping\n&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;10&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #008000; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;pthread_testcancel();&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;11&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sleep(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;1&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;12&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;13&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;return&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;NULL;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;14&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;15&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;16&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;int&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;main(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;int&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;argc,&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;char&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;**argv)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;17&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;18&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;pthread_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;thread;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;19&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;int&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rc=&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;0&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;20&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;21&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;Entering&amp;nbsp;testcase\n&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;22&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;23&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #008000; font-size: 10pt"&gt;/*&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008000; font-size: 10pt"&gt;&amp;nbsp;Create&amp;nbsp;a&amp;nbsp;thread&amp;nbsp;using&amp;nbsp;default&amp;nbsp;attributes&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008000; font-size: 10pt"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;24&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;Create&amp;nbsp;thread&amp;nbsp;using&amp;nbsp;the&amp;nbsp;NULL&amp;nbsp;attributes\n&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;25&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;rc&amp;nbsp;=&amp;nbsp;pthread_create(&amp;amp;thread,&amp;nbsp;NULL,&amp;nbsp;threadfunc,&amp;nbsp;NULL);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;26&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;checkResults(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;pthread_create(NULL)\n&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;,&amp;nbsp;rc);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;27&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;28&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #008000; font-size: 10pt"&gt;/*&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008000; font-size: 10pt"&gt;&amp;nbsp;sleep()&amp;nbsp;is&amp;nbsp;not&amp;nbsp;a&amp;nbsp;very&amp;nbsp;robust&amp;nbsp;way&amp;nbsp;to&amp;nbsp;wait&amp;nbsp;for&amp;nbsp;the&amp;nbsp;thread&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008000; font-size: 10pt"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;29&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;sleep(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;1&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;30&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;31&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;Cancel&amp;nbsp;the&amp;nbsp;thread\n&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;32&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;rc&amp;nbsp;=&amp;nbsp;pthread_cancel(thread);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;33&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;checkResults(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;pthread_cancel()\n&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;,&amp;nbsp;rc);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;34&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;35&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #008000; font-size: 10pt"&gt;/*&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008000; font-size: 10pt"&gt;&amp;nbsp;sleep()&amp;nbsp;is&amp;nbsp;not&amp;nbsp;a&amp;nbsp;very&amp;nbsp;robust&amp;nbsp;way&amp;nbsp;to&amp;nbsp;wait&amp;nbsp;for&amp;nbsp;the&amp;nbsp;thread&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008000; font-size: 10pt"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;36&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;sleep(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;10&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;37&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;Main&amp;nbsp;completed\n&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;38&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;0&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;39&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: Comic Sans MS; font-size: 12pt"&gt;输出：&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;Entering&amp;nbsp;testcase&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;Create&amp;nbsp;thread&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;using&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;the&amp;nbsp;NULL&amp;nbsp;attributes&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;Entered&amp;nbsp;secondary&amp;nbsp;thread&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;Secondary&amp;nbsp;thread&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;is&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;looping&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;Cancel&amp;nbsp;the&amp;nbsp;thread&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;Main&amp;nbsp;completed&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: Comic Sans MS; font-size: 12pt"&gt;&amp;nbsp;&amp;nbsp;POSIX保证了绝大部分的系统调用函数内部有取消点，我们看到很多在cancel调用的情景下，recv和send函数最后都会设置&lt;/span&gt;&lt;font color="#008000"&gt;&lt;strong style="font-family: Comic Sans MS; color: #000000; font-size: 12pt"&gt;pthread_testcancel()&lt;/strong&gt;&lt;span style="color: #000000"&gt;取消点，其实这不是那么有必要的，那么究竟什么时候该&lt;strong&gt;&lt;font color="#008000"&gt;&lt;span style="color: #000000"&gt;pthread_testcancel()&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;出场呢？《Unix高级环境编程》也说了，当遇到大量的基础计算时（如科学计算），需要自己来设置取消点。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#008000"&gt;&lt;span style="font-family: Comic Sans MS; color: #000000; font-size: 12pt"&gt;ok，得益于pthread_cancel，我们很轻松的把线程可以cancel掉，可是我们的资源呢？何时释放...&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#008000"&gt;&lt;span style="font-family: Comic Sans MS; color: #000000; font-size: 12pt"&gt;下面来看两个pthread函数&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;blockquote style="margin-right: 0px" dir="ltr"&gt;&lt;p&gt;&lt;font color="#008000"&gt;&lt;span style="font-family: Comic Sans MS; color: #000000; font-size: 12pt"&gt;1.void pthread_cleanup_push(void (*routine)(void *), void *arg);&amp;nbsp; &lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;font color="#008000"&gt;&lt;span style="font-family: Comic Sans MS; color: #000000; font-size: 12pt"&gt;2.void pthread_cleanup_pop(int execute);&amp;nbsp;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;font color="#008000"&gt;&lt;span style="font-family: Comic Sans MS; color: #000000; font-size: 12pt"&gt;这两个函数能够保证在&amp;nbsp;1函数调用之后，2函数调用之前的任何形式的线程结束调用向pthread_cleanup_push注册的回调函数&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #000000; font-size: 12pt"&gt;另外我们还可通过下面这个函数来设置一些状态&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;blockquote style="margin-right: 0px" dir="ltr"&gt;&lt;p&gt;&lt;font color="#008000"&gt;&lt;span style="font-family: Comic Sans MS; color: #000000; font-size: 12pt"&gt;&amp;nbsp;int pthread_setcanceltype(int type, int *oldtype);&amp;nbsp;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;font color="#008000"&gt;&lt;span style="color: #000000"&gt;&lt;p&gt;&lt;table border="1" width="80%"&gt;     &lt;tbody&gt;         &lt;tr&gt;             &lt;th valign="top"&gt;&lt;span style="font-family: Comic Sans MS; font-size: 12pt"&gt;Cancelability&lt;/span&gt;&lt;/th&gt;             &lt;th valign="top"&gt;&lt;span style="font-family: Comic Sans MS; font-size: 12pt"&gt;Cancelability State&lt;/span&gt;&lt;/th&gt;             &lt;th valign="top"&gt;&lt;span style="font-family: Comic Sans MS; font-size: 12pt"&gt;Cancelability Type&lt;/span&gt;&lt;/th&gt;         &lt;/tr&gt;         &lt;tr&gt;             &lt;td valign="top" width="20%" align="left"&gt;&lt;span style="font-family: Comic Sans MS; font-size: 12pt"&gt;disabled&lt;/span&gt;&lt;/td&gt;             &lt;td valign="top" width="40%" align="left"&gt;PTHREAD_CANCEL_DISABLE&lt;/td&gt;             &lt;td valign="top" width="40%" align="left"&gt;PTHREAD_CANCEL_DEFERRED&lt;/td&gt;         &lt;/tr&gt;         &lt;tr&gt;             &lt;td valign="top" align="left"&gt;&lt;span style="font-family: Comic Sans MS; font-size: 12pt"&gt;disabled&lt;/span&gt;&lt;/td&gt;             &lt;td valign="top" align="left"&gt;PTHREAD_CANCEL_DISABLE&lt;/td&gt;             &lt;td valign="top" align="left"&gt;PTHREAD_CANCEL_ASYNCHRONOUS&lt;/td&gt;         &lt;/tr&gt;         &lt;tr&gt;             &lt;td valign="top" align="left"&gt;&lt;span style="font-family: Comic Sans MS; font-size: 12pt"&gt;deferred&lt;/span&gt;&lt;/td&gt;             &lt;td valign="top" align="left"&gt;PTHREAD_CANCEL_ENABLE&lt;/td&gt;             &lt;td valign="top" align="left"&gt;PTHREAD_CANCEL_DEFERRED&lt;/td&gt;         &lt;/tr&gt;         &lt;tr&gt;             &lt;td valign="top" align="left"&gt;&lt;span style="font-family: Comic Sans MS; font-size: 12pt"&gt;asynchronous&lt;/span&gt;&lt;/td&gt;             &lt;td valign="top" align="left"&gt;PTHREAD_CANCEL_ENABLE&lt;/td&gt;             &lt;td valign="top" align="left"&gt;PTHREAD_CANCEL_ASYNCHRONOUS&lt;/td&gt;         &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Comic Sans MS; font-size: 12pt"&gt;&lt;strong&gt;&lt;/strong&gt;当我们设置type为&lt;/span&gt;PTHREAD_CANCEL_ASYNCHRONOUS时，线程并不会等待命中取消点才结束，而是立马结束&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Comic Sans MS; font-size: 12pt"&gt;好了，下面贴代码：&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 12pt"&gt;&amp;nbsp;1&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 12pt"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;#include&amp;nbsp;&amp;lt;pthread.h&amp;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;2&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;#include&amp;nbsp;&amp;lt;stdio.h&amp;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;3&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;#include&amp;nbsp;&amp;lt;stdlib.h&amp;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;4&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;#include&amp;nbsp;&amp;lt;unistd.h&amp;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;5&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;#include&amp;nbsp;&amp;lt;errno.h&amp;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;int&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;footprint=&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;0&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;char&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;*storage;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;void&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;freerc(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;void&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;*s)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;&amp;nbsp;9&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;10&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;free(s);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;11&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;puts(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;the&amp;nbsp;free&amp;nbsp;called&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;12&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;13&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;14&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;void&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;checkResults(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;char&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;*&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;string&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;int&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;rc)&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;15&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;if&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;(rc)&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;16&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;Error&amp;nbsp;on&amp;nbsp;:&amp;nbsp;%s,&amp;nbsp;rc=%d&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;17&lt;/span&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;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;string&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;,&amp;nbsp;rc);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;18&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit(EXIT_FAILURE);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;19&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;20&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;return&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;21&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;22&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;23&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;void&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;*thread(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;void&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;*arg)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;24&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;int&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rc=&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;0&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;,&amp;nbsp;oldState=&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;0&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;25&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;rc&amp;nbsp;=&amp;nbsp;pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,&amp;nbsp;&amp;amp;oldState);&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008000; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008000; font-size: 10pt"&gt;close&amp;nbsp;the&amp;nbsp;cancel&amp;nbsp;switch&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;26&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;checkResults(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;pthread_setcancelstate()\n&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;,&amp;nbsp;rc);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;27&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;if&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;((storage&amp;nbsp;=&amp;nbsp;(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;char&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;*)&amp;nbsp;malloc(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;80&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;))&amp;nbsp;==&amp;nbsp;NULL)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;28&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;perror(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;malloc()&amp;nbsp;failed&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;29&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;6&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;30&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;31&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rc&amp;nbsp;=&amp;nbsp;pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,&amp;amp;oldState);&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008000; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008000; font-size: 10pt"&gt;open&amp;nbsp;the&amp;nbsp;cancel&amp;nbsp;&amp;nbsp;switch&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;32&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;checkResults(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;pthread_setcancelstate(2)\n&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;,&amp;nbsp;rc);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;33&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #008000; font-size: 10pt"&gt;/*&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008000; font-size: 10pt"&gt;&amp;nbsp;Plan&amp;nbsp;to&amp;nbsp;release&amp;nbsp;storage&amp;nbsp;even&amp;nbsp;if&amp;nbsp;thread&amp;nbsp;doesn't&amp;nbsp;exit&amp;nbsp;normally&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008000; font-size: 10pt"&gt;*/&lt;/span&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;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;34&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;35&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;pthread_cleanup_push(freerc,&amp;nbsp;storage);&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008000; font-size: 10pt"&gt;/*&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008000; font-size: 10pt"&gt;the&amp;nbsp;free&amp;nbsp;is&amp;nbsp;method&amp;nbsp;here&amp;nbsp;&amp;nbsp;&amp;nbsp;you&amp;nbsp;can&amp;nbsp;use&amp;nbsp;your&amp;nbsp;own&amp;nbsp;method&amp;nbsp;here&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008000; font-size: 10pt"&gt;*/&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;36&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;37&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;puts(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;thread&amp;nbsp;has&amp;nbsp;obtained&amp;nbsp;storage&amp;nbsp;and&amp;nbsp;is&amp;nbsp;waiting&amp;nbsp;to&amp;nbsp;be&amp;nbsp;cancelled&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;38&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;footprint++;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;39&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;while&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;1&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;40&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;41&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pthread_testcancel();&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008000; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008000; font-size: 10pt"&gt;make&amp;nbsp;a&amp;nbsp;break&amp;nbsp;point&amp;nbsp;here&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;42&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008000; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008000; font-size: 10pt"&gt;pthread_exit(NULL);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008000; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008000; font-size: 10pt"&gt;test&amp;nbsp;exit&amp;nbsp;to&amp;nbsp;exam&amp;nbsp;whether&amp;nbsp;the&amp;nbsp;freerc&amp;nbsp;method&amp;nbsp;called&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;43&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;sleep(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;1&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;44&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;45&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;46&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;pthread_cleanup_pop(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;1&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;47&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;48&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;49&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;main()&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;50&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;pthread_t&amp;nbsp;thid;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;51&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;void&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*status=NULL;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;52&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;53&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;if&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;(pthread_create(&amp;amp;thid,&amp;nbsp;NULL,&amp;nbsp;thread,&amp;nbsp;NULL)&amp;nbsp;!=&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;0&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;54&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;perror(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;pthread_create()&amp;nbsp;error&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;55&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;1&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;56&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;57&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;58&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;while&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;(footprint&amp;nbsp;==&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;0&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;59&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sleep(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;1&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;60&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;61&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;puts(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;IPT&amp;nbsp;is&amp;nbsp;cancelling&amp;nbsp;thread&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;62&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;63&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;if&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;(pthread_cancel(thid)&amp;nbsp;!=&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;0&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;64&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;perror(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;pthread_cancel()&amp;nbsp;error&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;65&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sleep(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;2&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;66&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;3&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;67&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;68&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;69&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;if&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;(pthread_join(thid,&amp;nbsp;&amp;amp;status)&amp;nbsp;!=&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;0&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;70&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;if&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;(status&amp;nbsp;!=&amp;nbsp;PTHREAD_CANCELED){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;71&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;perror(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;pthread_join()&amp;nbsp;error&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;72&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080; font-size: 10pt"&gt;4&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;73&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;74&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;75&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff; font-size: 10pt"&gt;if&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;(status&amp;nbsp;==&amp;nbsp;PTHREAD_CANCELED)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;76&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;puts(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;PTHREAD_CANCELED&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;77&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;78&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;puts(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;main&amp;nbsp;exit&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000; font-size: 10pt"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080; font-size: 10pt"&gt;79&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; font-size: 10pt"&gt;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/font&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Creator/aggbug/2408413.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Creator/archive/2012/03/21/2408413.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Creator/archive/2012/03/07/2384084.html</id><title type="text">MongoDB源码概述——启动处理</title><summary type="text">在启动MongoDB后，程序会对相应的参数，上次遗留的锁文件，日志文件等等进行相应的处理，同时也会开启一些支撑其他部分运行的服务线程，为了精读MongoDB的代码，领会其全局设计理念，所以我对这些不是特别核心的部分，也通过博文给自己来做一个总结，方便自己以后查阅。 程序在mian函数里进行了对输入参数的所有处理，程序使用Boost库实现了跨平台的命令行参数的兼容性，这部分的代码非常庞大，也非常的乱，所以也没有必要太过记载，在main函数的底部进行了initAndListen(cmdLine.port, appsrvPath);调用，这个函数就是我们的重点部分。 在void _...</summary><published>2012-03-07T13:21:00Z</published><updated>2012-03-07T13:21:00Z</updated><author><name>大熊 | Zealot Yin</name><uri>http://www.cnblogs.com/Creator/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Creator/archive/2012/03/07/2384084.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Creator/archive/2012/03/07/2384084.html"/><content type="html">&lt;div&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;在启动MongoDB后，程序会对相应的参数，上次遗留的锁文件，日志文件等等进行相应的处理，同时也会开启一些支撑其他部分运行的服务线程，为了精读MongoDB的代码，领会其全局设计理念，所以我对这些不是特别核心的部分，也通过博文给自己来做一个总结，方便自己以后查阅。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 12pt; "&gt;程序在mian函数里进行了对输入参数的所有处理，程序使用Boost库实现了跨平台的命令行参数的兼容性，这部分的代码非常庞大，也非常的乱，所以也没有必要太过记载，在main函数的底部进行了&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;initAndListen(cmdLine.port, appsrvPath);&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;调用，这个函数就是我们的重点部分。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 12pt; "&gt;在void _initAndListen(int listenPort, const char  *appserverLoc = NULL)内函数首先进行了一些运行环境的相关检验，如：判断当前系统是不是32bit系统：bool is32bit =  sizeof(int*) == 4;接着输出一些版本信息(这部分代码就不贴了）&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;后面进行了acquirePathLock()方法的调用。&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;void acquirePathLock() {&lt;/div&gt;&lt;p&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&amp;nbsp;name&amp;nbsp;=&amp;nbsp;(&amp;nbsp;boost::filesystem::path(&amp;nbsp;dbpath&amp;nbsp;)&amp;nbsp;/&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;mongod.lock&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;).native_file_string();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;bool&lt;/span&gt;&amp;nbsp;oldFile&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;oldFile为true的概念是存在mongod.lock并且它的filesize大于0,。&amp;nbsp;正常结束的进程会将mongodb.lock大小设置为0（包括CTRL+C）&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(&amp;nbsp;boost::filesystem::exists(&amp;nbsp;name&amp;nbsp;)&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;boost::filesystem::file_size(&amp;nbsp;name&amp;nbsp;)&amp;nbsp;&amp;gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&amp;nbsp;)&amp;nbsp;{&lt;br /&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;oldFile&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;we&amp;nbsp;check&amp;nbsp;this&amp;nbsp;here&amp;nbsp;because&amp;nbsp;we&amp;nbsp;want&amp;nbsp;to&amp;nbsp;see&amp;nbsp;if&amp;nbsp;we&amp;nbsp;can&amp;nbsp;get&amp;nbsp;the&amp;nbsp;lock&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;if&amp;nbsp;we&amp;nbsp;can't,&amp;nbsp;then&amp;nbsp;its&amp;nbsp;probably&amp;nbsp;just&amp;nbsp;another&amp;nbsp;mongod&amp;nbsp;running&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lockFile&amp;nbsp;=&amp;nbsp;open(&amp;nbsp;name.c_str(),&amp;nbsp;O_RDWR&amp;nbsp;|&amp;nbsp;O_CREAT&amp;nbsp;,&amp;nbsp;S_IRWXU&amp;nbsp;|&amp;nbsp;S_IRWXG&amp;nbsp;|&amp;nbsp;S_IRWXO&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;(&amp;nbsp;lockFile&amp;nbsp;&amp;lt;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&amp;nbsp;)&amp;nbsp;{&lt;br /&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;uasserted(&amp;nbsp;&lt;span style="color: #800080;"&gt;10309&lt;/span&gt;&amp;nbsp;,&amp;nbsp;str::stream()&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Unable&amp;nbsp;to&amp;nbsp;create&amp;nbsp;/&amp;nbsp;open&amp;nbsp;lock&amp;nbsp;file&amp;nbsp;for&amp;nbsp;lockfilepath:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;name&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;errnoWithDescription());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(flock(&amp;nbsp;lockFile,&amp;nbsp;LOCK_EX&amp;nbsp;|&amp;nbsp;LOCK_NB&amp;nbsp;)&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;man&amp;nbsp;2&amp;nbsp;flock&amp;nbsp;查看参数&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&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;close&amp;nbsp;(&amp;nbsp;lockFile&amp;nbsp;);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;若另一个mongod程序锁住了该文件，则flock&amp;nbsp;LOCK_EX会失败（即返回结果！=0），抛出下面的异常，此处保证了一个dbpath不能被两个mongod程序同时打开&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&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;lockFile&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&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;uassert(&amp;nbsp;&lt;span style="color: #800080;"&gt;10310&lt;/span&gt;&amp;nbsp;,&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Unable&amp;nbsp;to&amp;nbsp;acquire&amp;nbsp;lock&amp;nbsp;for&amp;nbsp;lockfilepath:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;name,&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(&amp;nbsp;oldFile&amp;nbsp;)&amp;nbsp;{&lt;br /&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;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;若上次异常结束&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&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;span style="color: #0000FF;"&gt;string&lt;/span&gt;&amp;nbsp;errmsg;&lt;br /&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;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(cmdLine.dur)&amp;nbsp;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;若开启了-dur属性&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(!dur::haveJournalFiles())&amp;nbsp;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vector&amp;lt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&amp;gt;&amp;nbsp;dbnames;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;getDatabaseNames(&amp;nbsp;dbnames&amp;nbsp;);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;获取同一目录下的所有xx.ns的xx，存入dbnames&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&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;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(&amp;nbsp;dbnames.size()&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&amp;nbsp;)&amp;nbsp;{&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;在没有任何xx.ns的情况下，不需要修复，所以也就不需要处理了，直接让程序继续运行&lt;br /&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;&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;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;this&amp;nbsp;means&amp;nbsp;that&amp;nbsp;mongod&amp;nbsp;crashed&lt;br /&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;&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;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;between&amp;nbsp;initial&amp;nbsp;startup&amp;nbsp;and&amp;nbsp;when&amp;nbsp;journaling&amp;nbsp;was&amp;nbsp;initialized&lt;br /&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;&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;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;it&amp;nbsp;is&amp;nbsp;safe&amp;nbsp;to&amp;nbsp;continue&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&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;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;errmsg&amp;nbsp;=&amp;nbsp;str::stream()&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;**************&amp;nbsp;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;old&amp;nbsp;lock&amp;nbsp;file:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;name&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;.&amp;nbsp;&amp;nbsp;probably&amp;nbsp;means&amp;nbsp;unclean&amp;nbsp;shutdown,\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;but&amp;nbsp;there&amp;nbsp;are&amp;nbsp;no&amp;nbsp;journal&amp;nbsp;files&amp;nbsp;to&amp;nbsp;recover.\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;this&amp;nbsp;is&amp;nbsp;likely&amp;nbsp;human&amp;nbsp;error&amp;nbsp;or&amp;nbsp;filesystem&amp;nbsp;corruption.\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;found&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;dbnames.size()&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;nbsp;dbs.\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;see:&amp;nbsp;http://dochub.mongodb.org/core/repair&amp;nbsp;for&amp;nbsp;more&amp;nbsp;information\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;*************&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;br /&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;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;若没有开启了-dur属性又存在.lock文件，则给出错误信息到errmsg&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;errmsg&amp;nbsp;=&amp;nbsp;str::stream()&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;**************&amp;nbsp;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;old&amp;nbsp;lock&amp;nbsp;file:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;name&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;.&amp;nbsp;&amp;nbsp;probably&amp;nbsp;means&amp;nbsp;unclean&amp;nbsp;shutdown\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;recommend&amp;nbsp;removing&amp;nbsp;file&amp;nbsp;and&amp;nbsp;running&amp;nbsp;--repair\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;see:&amp;nbsp;http://dochub.mongodb.org/core/repair&amp;nbsp;for&amp;nbsp;more&amp;nbsp;information\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;*************&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&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;br /&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;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;若有上面errmsg有任何错误信息，则停止程序&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&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;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(!errmsg.empty())&amp;nbsp;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;errmsg&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close&amp;nbsp;(&amp;nbsp;lockFile&amp;nbsp;);&lt;br /&gt;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lockFile&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uassert(&amp;nbsp;&lt;span style="color: #800080;"&gt;12596&lt;/span&gt;&amp;nbsp;,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;old&amp;nbsp;lock&amp;nbsp;file&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;,&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&amp;nbsp;);&lt;br /&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;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Not&amp;nbsp;related&amp;nbsp;to&amp;nbsp;lock&amp;nbsp;file,&amp;nbsp;but&amp;nbsp;this&amp;nbsp;is&amp;nbsp;where&amp;nbsp;we&amp;nbsp;handle&amp;nbsp;unclean&amp;nbsp;shutdown&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;(&amp;nbsp;!cmdLine.dur&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;dur::haveJournalFiles()&amp;nbsp;)&amp;nbsp;{&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;如果竟不是-dur模式启动，但又有Journal日志文件，则异常退出，因为无法处理未持久化的数据&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&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;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;**************&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl;&lt;br /&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;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Error:&amp;nbsp;journal&amp;nbsp;files&amp;nbsp;are&amp;nbsp;present&amp;nbsp;in&amp;nbsp;journal&amp;nbsp;directory,&amp;nbsp;yet&amp;nbsp;starting&amp;nbsp;without&amp;nbsp;--dur&amp;nbsp;enabled.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl;&lt;br /&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;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;It&amp;nbsp;is&amp;nbsp;recommended&amp;nbsp;that&amp;nbsp;you&amp;nbsp;start&amp;nbsp;with&amp;nbsp;journaling&amp;nbsp;enabled&amp;nbsp;so&amp;nbsp;that&amp;nbsp;recovery&amp;nbsp;may&amp;nbsp;occur.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl;&lt;br /&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;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Alternatively&amp;nbsp;(not&amp;nbsp;recommended),&amp;nbsp;you&amp;nbsp;can&amp;nbsp;backup&amp;nbsp;everything,&amp;nbsp;then&amp;nbsp;delete&amp;nbsp;the&amp;nbsp;journal&amp;nbsp;files,&amp;nbsp;and&amp;nbsp;run&amp;nbsp;--repair&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl;&lt;br /&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;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;**************&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl;&lt;br /&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;uasserted(&lt;span style="color: #800080;"&gt;13597&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;can't&amp;nbsp;start&amp;nbsp;without&amp;nbsp;--dur&amp;nbsp;enabled&amp;nbsp;when&amp;nbsp;journal/&amp;nbsp;files&amp;nbsp;are&amp;nbsp;present&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;uassert(&amp;nbsp;&lt;span style="color: #800080;"&gt;13342&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Unable&amp;nbsp;to&amp;nbsp;truncate&amp;nbsp;lock&amp;nbsp;file&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;ftruncate(lockFile,&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writePid(&amp;nbsp;lockFile&amp;nbsp;);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;将进程号写入了mongod.lock文件&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fsync(&amp;nbsp;lockFile&amp;nbsp;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;对于这段代码的逻辑，我这里就不罗嗦了，我画了一张流程图，我相信图片比代码更容易让人理解。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;img src="http://images.cnblogs.com/cnblogs_com/creator/Instance_acquirePathLock00.jpg" width="520" height="675" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;oldFile为true的概念是存在mongod.lock并且它的filesize大于0,对于这一点可能大家不太容易理解filesize在这个特定语境的意思，我们来看在db.cpp里注册的信号处理函数就明白了。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: verdana, 'courier new'; font-size: 15px; line-height: 17px; color: #0000ff; "&gt;void&lt;/span&gt;&lt;span style="font-family: verdana, 'courier new'; font-size: 15px; line-height: 17px; "&gt;&amp;nbsp;ctrlCTerminate()&amp;nbsp;{&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;log()&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;got&amp;nbsp;kill&amp;nbsp;or&amp;nbsp;ctrl-c&amp;nbsp;signal,&amp;nbsp;will&amp;nbsp;terminate&amp;nbsp;after&amp;nbsp;current&amp;nbsp;cmd&amp;nbsp;ends&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Client::initThread(&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ctrlCTerminate&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exitCleanly(&amp;nbsp;EXIT_KILL&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;&lt;/div&gt;&lt;p&gt;在exitCleanly中 最后调用了shutdownServer函数，负责所有的扫尾工作，对于我们关注的mongo.lock的处理部分如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: verdana, 'courier new'; font-size: 15px; line-height: 17px; color: #0000ff; "&gt;if&lt;/span&gt;&lt;span style="font-family: verdana, 'courier new'; font-size: 15px; line-height: 17px; "&gt;&amp;nbsp;(&amp;nbsp;lockFile&amp;nbsp;)&amp;nbsp;{&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;log()&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;shutdown:&amp;nbsp;removing&amp;nbsp;fs&amp;nbsp;lock...&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl;&lt;br /&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;span style="color: #0000FF;"&gt;if&lt;/span&gt;(&amp;nbsp;ftruncate(&amp;nbsp;lockFile&amp;nbsp;,&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&amp;nbsp;)&amp;nbsp;)&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;man&amp;nbsp;&amp;nbsp;ftruncate&amp;nbsp;&amp;nbsp;设置文件大小为0&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;log()&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;couldn't&amp;nbsp;remove&amp;nbsp;fs&amp;nbsp;lock&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;errnoWithDescription()&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl;&lt;br /&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;flock(&amp;nbsp;lockFile,&amp;nbsp;LOCK_UN&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;也就是是，只要是正常退出（包括CTRL+C)，mongo.lock的大小就会为0，所以可以通过它来判断上次服务此是怎么结束的。&lt;/p&gt;&lt;p&gt;在_initAndListen&amp;nbsp;方法中还进行了如下调用：&lt;/p&gt;&lt;p&gt;FileAllocator::get()-&amp;gt;start();&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;一看到这种调用入口，就可以推测出这里肯定使用的是单例模式&lt;/span&gt;&lt;img src="http://www.cnblogs.com/Emoticons/qface/055242240.gif" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;在我们调用的start方法中，FileAllocator创建了一个单独的线程来专门运行其run方法&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;FileAllocator::start()&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;boost::thread&amp;nbsp;t(&amp;nbsp;boost::bind(&amp;nbsp;&amp;amp;FileAllocator::run&amp;nbsp;,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&amp;nbsp;)&amp;nbsp;);&lt;/div&gt;&lt;p&gt;}&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&amp;nbsp;&lt;span style="font-size: 12pt; "&gt;FileAllocator::run方法类似于一个单独的服务的线程，专门提供创建指定大小文件的任务。&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp;当系统的其他运行部分需要使用它的服务的时候，只需要在那个线程调用&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp;FileAllocator::requestAllocation函数&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;这个函数会把用户想要创建的文件名放入&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;list&amp;lt; string &amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-size: 12pt; "&gt;_pending&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;中存储，将其文件名和大小对应关系存入&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;mutable map&amp;lt; string, long &amp;gt;中&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;同时这个函数还是用了&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;boost::condition来进行同步操作（类似于生产者消费者），在run函数中，放文件创建需求列表（_pending)为空时会进行等待&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp; &amp;nbsp;if ( fa-&amp;gt;_pending.size() == 0 )&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fa-&amp;gt;_pendingUpdated.wait( lk.boost() );&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;这样就防止了无限循环while所带来了损耗CPU时间的弊端&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;若需求列表中有需要创建的item了就会调用系统API进行文件创建&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;long fd = open(name.c_str(), O_CREAT | O_RDWR | O_NOATIME, S_IRUSR | S_IWUSR);&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;通过上面的调用， 文件是被创建了，可是需求却没有得到满足，因为我们创建的文件不是指定大小的，这里有必要解释一下为什么需要先创建指定大小的文件，因为对于数据库文件来说，操作很有可能是非常频繁，这就对我存数据的文件提出了要求，我们总是希望数据库文件在磁盘上能得到一块连续的空间（就像内存分配一样），这样对文件进行读写的时候，文件的&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;fragments比较少，读起来也会比较快（系统API级别的，不可控的），所以一般希望能够&lt;/span&gt;&lt;strong style="font-size: 12pt; "&gt;Handles allocation of contiguous files on disk&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp;下面来看mongoDB是怎么处理这个问题的：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;在调用open创建文件后会进行&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;&amp;nbsp;ensureLength( fd , size )调用，在&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;ensureLength内部会进行下面的循环&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;1&lt;/span&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;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;*&amp;nbsp;buf&amp;nbsp;=&amp;nbsp;buf_holder.&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;();&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;2&lt;/span&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;&amp;nbsp;memset(buf,&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;,&amp;nbsp;z);&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;3&lt;/span&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;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;long&lt;/span&gt;&amp;nbsp;left&amp;nbsp;=&amp;nbsp;size;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;4&lt;/span&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;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;while&lt;/span&gt;&amp;nbsp;(&amp;nbsp;left&amp;nbsp;&amp;gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&amp;nbsp;)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;5&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;long&lt;/span&gt;&amp;nbsp;towrite&amp;nbsp;=&amp;nbsp;left;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;6&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(&amp;nbsp;towrite&amp;nbsp;&amp;gt;&amp;nbsp;z&amp;nbsp;)&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;7&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;towrite&amp;nbsp;=&amp;nbsp;z;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;9&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;written&amp;nbsp;=&amp;nbsp;write(&amp;nbsp;fd&amp;nbsp;,&amp;nbsp;buf&amp;nbsp;,&amp;nbsp;towrite&amp;nbsp;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uassert(&amp;nbsp;&lt;span style="color: #800080;"&gt;10443&lt;/span&gt;&amp;nbsp;,&amp;nbsp;errnoWithPrefix(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FileAllocator:&amp;nbsp;file&amp;nbsp;write&amp;nbsp;failed&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;),&amp;nbsp;written&amp;nbsp;&amp;gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&amp;nbsp;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;left&amp;nbsp;-=&amp;nbsp;written;&lt;/div&gt;&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;}&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;看完 之后你会不会很惊讶，居然创建指定大小的文件是通过while循环来做的，没错，不管你有没有惊讶，反正我惊讶了。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;后来仔细一想，其实这也是一个还不错的方案，毕竟暂时我还没有发现任何可以创建指定大小，空间连续的文件的方法，虽然用上面的方法不能保证空间就一定连续，但是集中在一个时间在占用文件大小，比需要时每次再去写一下，&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;fragments会少很多。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; "&gt;Ok,现在总结一下，FileAllocator的职责就是尽量创建&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;fragments少的指定大小的文件，实现方法为，一个线程专门用于提供创建文件和填充到指定大小的服务，其他的线程调用&lt;/span&gt;&lt;span style="font-size: 12pt; "&gt;requestAllocation函数进行需求注册，服务线程获取需求，然后工作，其实也可以理解为一种生产者消费者模式，其他的线程生产出需求（文件名，大小），这可以理解为生产者，而服务线程可以理解为消费者，只有需求到达时才运行，否则等待....&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/Creator/aggbug/2384084.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Creator/archive/2012/03/07/2384084.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Creator/archive/2012/03/02/2377817.html</id><title type="text">MongoDB源码概述——日志</title><summary type="text">本篇文章主要介绍MongoDB的日志模块以及数据持久化存储模块的代码实现方式。大家也许会惊讶，为什么日志模块和持久化存储模块会放到一篇文章来总结。嘿嘿，在别的系统，可能这两个模块联系不是特别大，可是这MongoDB ,这两个模块还真不能分开来讲。这是怎么回事呢？请听我娓娓道来…通常说来,MongoDB具有三个日志模块，LogJournalOplog Log: 位于 log.h，它主要负责用户日志文件，这和我们普通系统的日志系统没有什么区别，作用也就是记录系统的一些重要流程，然后持久化到log文件。这个log文件可以通过系统启动参数"--logpath". Journal: </summary><published>2012-03-02T14:13:00Z</published><updated>2012-03-02T14:13:00Z</updated><author><name>大熊 | Zealot Yin</name><uri>http://www.cnblogs.com/Creator/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Creator/archive/2012/03/02/2377817.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Creator/archive/2012/03/02/2377817.html"/><content type="html">&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;本篇文章主要介绍MongoDB的日志模块以及数据持久化存储模块的代码实现方式。大家也许会惊讶，为什么日志模块和持久化存储模块会放到一篇文章来总结。嘿嘿，在别的系统，可能这两个模块联系不是特别大，可是这MongoDB ,这两个模块还真不能分开来讲。这是怎么回事呢？请听我娓娓道来&amp;#8230;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;通常说来,MongoDB具有三个日志模块，&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;Log&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;Journal&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;Oplog&lt;/span&gt;&lt;/font&gt; &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;Log: 位于 log.h，它主要负责用户日志文件，这和我们普通系统的日志系统没有什么区别，作用也就是记录系统的一些重要流程，然后持久化到log文件。这个log文件可以通过系统启动参数"--logpath".&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;Journal: 位于dur.h，通过启动参数"--dur"启动该模块功能。主要用于解决因系统宕机时，内存中的数据未写入磁盘而造成的数据丢失(为什么数据会被放到内存做存储而不是直接对外存上的文件进行操作呢？这一点与MongoDB的存储机制有关，稍后会讲到)。其机制主要是通过log方式定时将操作日志（对数据库有更改的操作，查询不在记录范围之类）记录到dbpath的命名为journal文件夹下，这样当系统再次重启时从该文件夹下恢复丢失的数据。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;Oplog :当部署应用于生产的健壮的服务器时，需要对服务器进行同步备份，MongoDB为解决这一问题提出了复制集(Replica sets)模式，而Oplog 的作用则主要是负责记录写服务器（一个复制集内只有一台服务器可写，多台备份服务器可读）上所有对数据的更改（查询等对数据库不产生更改的操作不会被记录）,这样，复制集内的其他读扩展（即用于备份的机器和分散读压力的服务器）的服务器通过获取Oplog 就可以进行差异同步了。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;本文主要是介绍日志和持久化存储，以及他们之间的关系。所以本文就不对Oplog做过多的说明，后续文章讲到复制集模块时，我一定会写上。本文的主要重点还是分析Journal以及持久化的实现，所以，对于Log模块，我也就只是简单的概括一下了。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;&lt;strong&gt;Log模块：&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;当我们启动MongoDB，对Log模块的调用流程如下:&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Comic Sans MS"&gt;　&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="font-family: Comic Sans MS"&gt;Main(...)-&amp;gt;addWindowsOptions(...)-&amp;gt;initLogging(...)-&amp;gt;loggingManager.start(...);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS"&gt;之后会调用这样的代码来设置stdout的输出目标&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS"&gt;FILE*&amp;nbsp;tmp&amp;nbsp;=&amp;nbsp;freopen(_path.c_str(),&amp;nbsp;(_append&amp;nbsp;?&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000"&gt;a&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;:&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000"&gt;w&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000"&gt;"&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;),&amp;nbsp;stdout);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS"&gt;又因为static的logfile指针指向stdout&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS"&gt;FILE*&amp;nbsp;Logstream::logfile&amp;nbsp;=&amp;nbsp;stdout;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS"&gt;所以在Logstream内最后数据会被flush到stdout，即系统所指定的目的地.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;在log.h下有如下定义：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Comic Sans MS"&gt;　&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="font-family: Comic Sans MS; color: #008080"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;enum&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;LogLevel&amp;nbsp;{&amp;nbsp;&amp;nbsp;LL_DEBUG&amp;nbsp;,&amp;nbsp;LL_INFO&amp;nbsp;,&amp;nbsp;LL_NOTICE&amp;nbsp;,&amp;nbsp;LL_WARNING&amp;nbsp;,&amp;nbsp;LL_ERROR&amp;nbsp;,&amp;nbsp;LL_SEVERE&amp;nbsp;};&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080"&gt;&amp;nbsp;2&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inline&amp;nbsp;Nullstream&amp;amp;&amp;nbsp;log(&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;level&amp;nbsp;)&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;(&amp;nbsp;level&amp;nbsp;&amp;gt;&amp;nbsp;logLevel&amp;nbsp;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080"&gt;&amp;nbsp;4&lt;/span&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;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;nullstream;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;Logstream::&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;get&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;().prolog();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080"&gt;&amp;nbsp;6&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080"&gt;&amp;nbsp;8&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inline&amp;nbsp;Nullstream&amp;amp;&amp;nbsp;log()&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;Logstream::&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;get&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;().prolog();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008080"&gt;10&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;又因为Logstream重载了一些基本的流符号：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="font-family: Comic Sans MS"&gt;Logstream&amp;amp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;operator&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;lt;&amp;lt;(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;char&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;*x)&amp;nbsp;{&amp;nbsp;ss&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;x;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;*&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS"&gt;Logstream&amp;amp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;operator&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;lt;&amp;lt;(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;amp;&amp;nbsp;x)&amp;nbsp;{&amp;nbsp;ss&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;x;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;*&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS"&gt;Logstream&amp;amp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;operator&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;lt;&amp;lt;(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;const&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;StringData&amp;amp;&amp;nbsp;x)&amp;nbsp;{&amp;nbsp;ss&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;x.data();&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;*&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS"&gt;Logstream&amp;amp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;operator&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;lt;&amp;lt;(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;char&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;*x)&amp;nbsp;{&amp;nbsp;ss&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;x;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;*&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;#8230;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS"&gt;Logstream&amp;amp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;operator&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;lt;&amp;lt;&amp;nbsp;(ostream&amp;amp;&amp;nbsp;(&amp;nbsp;*_endl&amp;nbsp;)(ostream&amp;amp;))&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS"&gt;ss&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000"&gt;'&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000"&gt;\n&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800000"&gt;'&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS"&gt;flush(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080"&gt;0&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;*&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS"&gt;Logstream&amp;amp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;operator&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;lt;&amp;lt;&amp;nbsp;(ios_base&amp;amp;&amp;nbsp;(*_hex)(ios_base&amp;amp;))&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS"&gt;ss&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;_hex;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;*&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;所以，我们可以轻松的使用下面的操作来记录我们的日志。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;&lt;strong&gt;log() &amp;lt;&amp;lt; "WARNING: alloc() failed after allocating new extent. lenWHdr: "&amp;lt;&amp;lt;endl;&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;我不知道大家是否喜欢我这样的分析模式，我是挺喜欢的，节奏快，很直接，很靠谱！&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;这里做一下简要说明&amp;lt;&amp;lt;重载运算符方法将要输出的日志放入stringstream的,接着调用&amp;lt;&amp;lt;endl时，触发 上面列出来的Logstream&amp;amp; operator&amp;lt;&amp;lt; (ostream&amp;amp; ( *_endl )(ostream&amp;amp;))方法，间接调用flush(0)&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;void Logstream::flush(Tee *t)方法的职责就是将stringstream内缓存的所有日志进行持久化到logfile.因为flush这部分的代码也非常的简洁易懂，所以这里就不贴了。至此用户日志也被写到了外存上，基本功能已经完成。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;在flush中另外值得注意是与Tee相关的代码&lt;/span&gt;&lt;/font&gt;&lt;span style="font-family: Comic Sans MS"&gt;　&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;(&amp;nbsp;t&amp;nbsp;)&amp;nbsp;t-&amp;gt;write(logLevel,&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;out&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;(&amp;nbsp;globalTees&amp;nbsp;)&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;(&amp;nbsp;unsigned&amp;nbsp;i=&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080"&gt;0&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;;&amp;nbsp;i&amp;lt;globalTees-&amp;gt;size();&amp;nbsp;i++&amp;nbsp;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS"&gt;(*globalTees)[i]-&amp;gt;write(logLevel,&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;out&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS"&gt;关于Tee的定义：&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;Tee&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;virtual&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;~Tee()&amp;nbsp;{}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;write(LogLevel&amp;nbsp;level&amp;nbsp;,&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;amp;&amp;nbsp;str)&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #800080"&gt;0&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS"&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;所以我们可以很清晰的认识到，实际上Tee的职责是订阅日志信息（观察者设计模式），任何Tee的派生类都可以实现在不影响现有日志的情景下将日志额外的记录到其他任何地方。例如远程日志.或者在服务器很多的情况下，收集各个服务器的用户日志放入数据库，以供管理员查看.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;&lt;strong&gt;Journal模块：&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;实际上在MongoDB中，Journal\Durability是一个很大的模块，牵扯到的东西也是非常之多，他的设计初衷是为了使用日志的方式来提高单机数据的可靠性，在1.7版本的最新分支上首次出现了这个部分.具体他的职责可以用一句话来概括：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;通过log方式定时将操作日志（对数据库有更改的操作，查询不在记录范围之类）记录到dbpath的命名为journal文件夹下，这样当系统再次重启时从该文件夹下恢复丢失的数据。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;根据其完成的功能，我们可以将这个部分的实现概括为以下几个问题：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;何时调用&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;如何记录用户操作&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;如何序列化用户操作并持久化&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;如何根据现有Journal日志恢复数据&lt;/span&gt;&lt;/font&gt; &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;下面我们来一一根据源码分析其重要步骤：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;&lt;strong&gt;一.何时调用&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;当我们需要更改数据库时，需要记录下用户的操作以及用户更改后的数据,这些记录的数据将是进行恢复时的数据源。举一个例子，我们向数据库插入一条记录的时候，我们需要记录用户的操作以及操作的数据，我截取了这部分代码，如下：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="font-family: Comic Sans MS"&gt;r&amp;nbsp;=&amp;nbsp;(Record*)&amp;nbsp;getDur().writingPtr(r,&amp;nbsp;lenWHdr);&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008000"&gt;//&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;持久化插入记录信息&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;(&amp;nbsp;obuf&amp;nbsp;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS"&gt;memcpy(r-&amp;gt;data,&amp;nbsp;obuf,&amp;nbsp;len);&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008000"&gt;//&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;直接拷贝数据到记录字段&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS"&gt;我们来看DurableImpl内的几个重要方法：&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008000"&gt;//&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;告诉系统我正在往x位置写入数据（更改或插入时丢会调用）&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;*&amp;nbsp;writingPtr(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;*x,&amp;nbsp;unsigned&amp;nbsp;len);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #008000"&gt;//&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;告诉系统我创建了一个文件&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;createdFile(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;filename,&amp;nbsp;unsigned&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;long&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;long&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;len);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;其实调用上两个函数的潜台词就是，我现在干了什么事，你给我把他完整的记录下来，如果我这件事没有最终被保存到磁盘的话，我就需要你这个负责记录的模块拿出原来所做的记录，我来进行恢复操作，以确保数据万无一失！&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;&lt;strong&gt;二.如何记录用户操作&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;在这个模块，用户的操作类型实际上可以归类为两种，一种是基本写操作，一种是非基本写操作。对数据的新增和修改等都可以认为是写操作，而类似与创建文件（FileCreatedOp）,删除数据库（DropDbOp）操作都是非基本写操作，这类操作建模为DurOp.最终这两种操作都会在CommitJob:: note()与 CommitJob::noteOp()进行内存存储。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;基本写操作会被D结构体封装,我们来看下他的结构：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Comic Sans MS"&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;struct&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;D&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;*p;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008000"&gt;//&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;用户更改的数据源首地址&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS"&gt;unsigned&amp;nbsp;len;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #008000"&gt;//&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;用户更改的数据长度&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;go(&lt;/span&gt;&lt;span style="font-family: Comic Sans MS; color: #0000ff"&gt;const&lt;/span&gt;&lt;span style="font-family: Comic Sans MS"&gt;&amp;nbsp;D&amp;amp;&amp;nbsp;d);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Comic Sans MS"&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;基本写记录会被存储到Writes类在CommitJob类的实例_wi,继而存储到TaskQueue&amp;lt;D&amp;gt;在Writes类的实例_deferred.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;非基本写记录会被存储到Writes类的vector&amp;lt; shared_ptr&amp;lt;DurOp&amp;gt; &amp;gt; _ops;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;这个流程有很多个类参与，下面用两张顺序图来总结这一流程。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;调用getDur().writingPtr的时序图&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Creator/201203/201203022155328884.png"&gt;&lt;font size="4"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="clip_image001[4]" border="0" alt="clip_image001[4]" src="http://images.cnblogs.com/cnblogs_com/Creator/201203/201203022155344475.png" width="690" height="358" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;调用getDur().createdFile的时序图&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Creator/201203/201203022155359359.png"&gt;&lt;font size="4"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://images.cnblogs.com/cnblogs_com/Creator/201203/201203022155387110.png" width="700" height="298" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;至此为止,用户操作日志在内存的记录操作就完成了。接下来要讲到如何序列化内存中的记录，以备持久化到磁盘.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;今日至此，下面两点下次结合其他的文章一起写。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;li&gt;&lt;font size="4"&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;如何序列化用户操作并持久化&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="4"&gt;&lt;font size="4"&gt;&lt;span style="font-family: Comic Sans MS"&gt;如何根据现有Journal日志恢复数据&lt;/span&gt;&lt;/font&gt; &lt;/font&gt;&lt;/li&gt;&lt;font size="4"&gt;&lt;/font&gt;&lt;p&gt;&lt;font size="4"&gt;后会有期......&lt;img src="http://www.cnblogs.com/Emoticons/face/006.gif" alt="" /&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Creator/aggbug/2377817.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Creator/archive/2012/03/02/2377817.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Creator/archive/2011/09/10/2173217.html</id><title type="text">树状数组</title><summary type="text">在一个数组中。若你需要频繁的计算一段区间内的和，你会怎么做？，最最简单的方法就是每次进行计算，但是这需要O(N)的时间复杂度，如这个需求非常的频繁，那么这个操作就会占用大量的CPU时间，进一步想一想，你有可能会想到使用空间换取时间的方法，把每一段区间的值一次记录下来，然后存储在内存中，将时间复杂度降低到O（1），的确，对于目前的这个需求来说，已经能够满足时间复杂度上的要求，尽管带来了线性空间复杂度的提升. 但若是我们的源数据需要频繁的更改怎么办？使用上面的方案，我们需要大量的更新我们保存到内存中的区间和，而且这中间的很多更新的影响是重叠的，我们需要重复计算。例如对于数组array[10]...</summary><published>2011-09-10T08:11:00Z</published><updated>2011-09-10T08:11:00Z</updated><author><name>大熊 | Zealot Yin</name><uri>http://www.cnblogs.com/Creator/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Creator/archive/2011/09/10/2173217.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Creator/archive/2011/09/10/2173217.html"/><content type="html">&lt;p&gt;&lt;span style="font-size: 12pt"&gt;&lt;font size="2"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;在一个数组中。若你需要频繁的计算一段区间内的和，你会怎么做？，最最简单的方法就是每次进行计算，但是这需要O(N)的时间复杂度，如这个需求非常的频繁，那么这个操作就会占用大量的CPU时间，进一步想一想，你有可能会想到使用空间换取时间的方法，把每一段区间的值一次记录下来，然后存储在内存中，将时间复杂度降低到O（1），的确，对于目前的这个需求来说，已经能够满足时间复杂度上的要求，尽管带来了线性空间复杂度的提升.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 12pt"&gt;&lt;font size="2"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;但若是我们的源数据需要频繁的更改怎么办？使用上面的方案，我们需要大量的更新我们保存到内存中的区间和，而且这中间的很多更新的影响是重叠的，我们需要重复计算。例如对于数组array[10],更新了array[4]值，需要更新区间[4,5],[4,5,6],在更新[4,5,6]需要又一次的计算[4,5]，这样的更新带来了非常多的重复计算，为了解决这一问题，树状数组应运而生了。&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 12pt"&gt;&lt;font size="2"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;当要频繁的对数组元素进行修改,同时又要频繁的查询数组内任一区间元素之和的时候,可以考虑使用树状数组.树状数组是一种非常优雅的数据结构.先来看看一张树状结构的图片&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Creator/201109/201109101606392439.gif"&gt;&lt;font size="2"&gt;&lt;img title="QQ截图未命名1" style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" height="308" alt="QQ截图未命名1" src="http://images.cnblogs.com/cnblogs_com/Creator/201109/201109101606402472.gif" width="505" border="0" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt;&amp;nbsp; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 12pt"&gt;&lt;font size="2"&gt;图中C[1]的值等于A[1]，C[2]的值等于C[1]+A[2]=A[1]+a[2],C[4]的值=C[2]+C[3]=A[1]+A[2]+A[3]+A[4],假设我们现在需要更改元素a[2],那么它将只影响到得c数组中的元素有c[2],c[4],c[8],我们只需要重新计算这几个值即可，减少了很多重复的操作。这就是树状结构大致的一个存贮示意图，下面看看他的定义：&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"&gt;&lt;p&gt;&lt;span style="font-size: 12pt"&gt;&lt;font size="2"&gt;&lt;span class="Apple-tab-span" style="white-space: pre"&gt; &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;strong&gt;假设a[1...N]为原数组,定义c[1...N]为对应的树状数组:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 12pt"&gt;&lt;font size="2"&gt;&lt;span class="Apple-tab-span" style="white-space: pre"&gt; &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;c[i] = a[i - 2^k + 1] + a[i - 2^k + 2] + ... + a[i] （其中k为i的二进制表示末尾0的个数）&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;&lt;span style="font-size: 12pt"&gt;&lt;font size="2"&gt;下面枚举出i由1...5的数据，可见正是因为上面的a[i - 2^k + 1]...a[i]的计算公式保证了我们C数组的正确意义，至于证明过程，大家可以翻阅相关资料..&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Creator/201109/20110910160640869.png"&gt;&lt;font size="2"&gt;&lt;img title="image" style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" height="170" alt="image" src="http://images.cnblogs.com/cnblogs_com/Creator/201109/20110910160640902.png" width="524" border="0" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 12pt"&gt;&lt;strong&gt;&lt;font size="2"&gt;基本操作：&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 12pt"&gt;&lt;font size="2"&gt;对于C[i]=a[i - 2^k + 1]...a[i]的定义中，比较难以逐磨的k，他的值等于i这个数的二进制表示末尾0的个数.如4的二进制表示0100,此时k就等于2，而实际上我们还会发现2^k就是前一位的权值,即0100中,2^2=4，刚好是前一位数1的权值.所以所以2^k可以表示为n&amp;amp;(n^(n-1))或更简单的n&amp;amp;(-n)，例如：&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 12pt"&gt;&lt;font size="2"&gt;为了表示简便，假设现在一个int型为4位,最高位为符号位&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 12pt"&gt;&lt;font size="2"&gt;int i=3&amp;amp;(-3);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 此时i=1，3的二进制为0011,-3的二进制为1101(负数存的是补码）所以0011&amp;amp;1101=1&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 12pt"&gt;&lt;font size="2"&gt;int j=4&amp;amp;(-4);&amp;nbsp;&amp;nbsp;&amp;nbsp; 此时j=4，理由同上..&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 12pt"&gt;&lt;font size="2"&gt;所以计算2^k我们可以用如下代码：&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;font class="Apple-style-span" size="3"&gt;&lt;span class="Apple-style-span" style="line-height: 24px;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;font class="Apple-style-span" size="3"&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;lowbit(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;x)&lt;/span&gt;&lt;span style="color: #008000; font-size: 10pt; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; font-size: 10pt; "&gt;计算lowbit&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;x&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;x);&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong style="font-size: 12pt"&gt;&lt;font size="2"&gt;求和操作：&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 12pt"&gt;&lt;font size="2"&gt;在上面的示意图中，若我们需要求sum[1..7]个元素的和，仅需要计算c[7]+c[6]+c[4]的和即可，究竟时间复杂度怎么算呢？一共要进行多少次求和操作呢？&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 12pt"&gt;&lt;font size="2"&gt;求sum[1..k],我们需查找k的二进制表示中1的个数次就能得到最终结果，具体为什么，请见代码i-=lowbit(i)注释&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;font class="Apple-style-span" size="3"&gt;&lt;/font&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;font class="Apple-style-span" size="3"&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;sum(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;i)&lt;/span&gt;&lt;span style="color: #008000; font-size: 10pt; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; font-size: 10pt; "&gt;求前i项和&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;s&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt;(i&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s&lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt;c[i];&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i&lt;/span&gt;&lt;span style="color: #000000;"&gt;-=&lt;/span&gt;&lt;span style="color: #000000;"&gt;lowbit(i);&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; font-size: 10pt; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; font-size: 10pt; "&gt;这一步实际上等价于将i的二进制表示的最后一个1剪去，再向前数当前1的权个数（例子在下面），&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; font-size: 10pt; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; font-size: 10pt; "&gt;而n的二进制里最多有log(n)个1，所以查询效率是log(n)&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; font-size: 10pt; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; font-size: 10pt; "&gt;在示意图上的操作即可理解为依次找到所有的子节点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;s;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 12pt"&gt;&lt;font size="2"&gt;以求sum[1..7]为例,二进制为0111,右边第一个1出现在第0位上,也就是说要从a[7]开始向前数1个元素(只有a[7]),即c[7];&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 12pt"&gt;&lt;font size="2"&gt;然后将这个1舍掉,得到6,二进制表示为0110,右边第一个1出现在第1位上,也就是说要从a[6]开始向前数2个元素(a[6],a[5]),即c[6];&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 12pt"&gt;&lt;font size="2"&gt;然后舍掉用过的1,得到4,二进制表示为0100,右边第一个1出现在第2位上,也就是说要从a[4]开始向前数4个元素(a[4],a[3],a[2],a[1]),即c[4].&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 12pt"&gt;&lt;font size="2"&gt;所以s[7]=c[7]+c[6]+c[4]&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;strong style="font-size: 12pt"&gt;给源数组加值操作&lt;/strong&gt;:&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 12pt"&gt;&lt;font size="2"&gt;在上面的示意图中，假设更改的元素是a[2],那么它影响到得c数组中的元素有c[2],c[4],c[8]，我们只需一层一层往上修改就可以了,这个过程的最坏的复杂度也不过O(logN);&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;font class="Apple-style-span" size="3"&gt;&lt;span class="Apple-style-span" style="line-height: 24px;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;font class="Apple-style-span" size="3"&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;add(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;i,&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;val)&amp;nbsp;&lt;br /&gt;{&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt;(i&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;n)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&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;c[i]&lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt;val;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i&lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt;lowbit(i);&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; font-size: 10pt; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; font-size: 10pt; "&gt;i+（i的二进制中最后一个1的权值,即2^k）,在示意图上的操作即为提升一层，到上一层的节点.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000; font-size: 10pt; "&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/span&gt;&lt;span style="color: #008000; font-size: 10pt; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; font-size: 10pt; "&gt;这个过程实际上也只是一个把末尾1后补0的过程（例子在下面）&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br /&gt;}&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 12pt"&gt;&lt;font size="2"&gt;以修改a[2]元素为例，需要修改c[2],2的二进制为0010,末尾补0为0100,即c[4]&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 12pt"&gt;&lt;font size="2"&gt;4的二进制为0100，在末尾补0为1000即c[8]。所以我们需要修改的有c[2],c[4],c[8]&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;POJ上面有一个这方面的水题，可以帮助理解&amp;nbsp; &lt;/font&gt;&lt;a href="http://poj.org/problem?id=2352"&gt;&lt;font size="2"&gt;http://poj.org/problem?id=2352&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;解题报告&lt;/font&gt;&lt;a href="http://hi.baidu.com/acmerskycoding/blog/item/40af1b2585dd310a4c088d95.html"&gt;&lt;font size="2"&gt;http://hi.baidu.com/acmerskycoding/blog/item/40af1b2585dd310a4c088d95.html&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Creator/aggbug/2173217.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Creator/archive/2011/09/10/2173217.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Creator/archive/2011/07/13/2105477.html</id><title type="text">离线应用——业务数据同步方案探讨</title><summary type="text">目标： 大家可以设想这样一个情景，公司已经部署信息化，且很多办公流程已经挪到线上正在运营的系统来解决，这带给企业的员工非常大的便利，节省办公时间，提高办公效率，可是我们把所有的流程和数据都放到了公司服务器，一旦离开了公司，我们就相当于和我们所有的办公环境脱离了，不再可以查看公司系统上的运营数据，不再可以进行添加删除等等一系列操作。如果你最近的工作非常的多，你在有限的正常办公时间内不能完成，那怎么办，只有在办公室奋战，叫苦不迭的夜晚办公室生活就开始了. 离线应用生来就是为了解决这样的问题，针对上面所列举的情况，你不需要在办公室进行奋战，你要做的只有 1.将线上系统某个列表（或存储结构）的数据按需</summary><published>2011-07-13T08:48:00Z</published><updated>2011-07-13T08:48:00Z</updated><author><name>大熊 | Zealot Yin</name><uri>http://www.cnblogs.com/Creator/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Creator/archive/2011/07/13/2105477.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Creator/archive/2011/07/13/2105477.html"/><content type="html">&lt;p&gt;&lt;font size="2"&gt;&lt;strong style="font-size: 14pt;"&gt;目标：&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;大家可以设想这样一个情景，公司已经部署信息化，且很多办公流程已经挪到线上正在运营的系统来解决，这带给企业的员工非常大的便利，节省办公时间，提高办公效率，可是我们把所有的流程和数据都放到了公司服务器，一旦离开了公司，我们就相当于和我们所有的办公环境脱离了，不再可以查看公司系统上的运营数据，不再可以进行添加删除等等一系列操作。如果你最近的工作非常的多，你在有限的正常办公时间内不能完成，那怎么办，只有在办公室奋战，叫苦不迭的夜晚办公室生活就开始了.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;离线应用生来就是为了解决这样的问题，针对上面所列举的情况，你不需要在办公室进行奋战，你要做的只有&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;1.将线上系统某个列表（或存储结构）的数据按需选择同步到本地&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;2.回到家，利用闲暇时间，打开离线应用，对数据进行操作&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;3.第二天回到公司，同步数据到公司服务器&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;说了这么多，我们的目的只有一个：实现离线办公&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;strong style="font-size: 14pt;"&gt;实现方案：&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;我们将整个离线应用分为两块&lt;/font&gt;&lt;/p&gt;  &lt;blockquote style="margin-right: 0px;" dir="ltr"&gt;&lt;p&gt;&lt;font size="2"&gt;1.业务数据同步到本地&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;2.本地提交到业务系统&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;  &lt;p&gt;&lt;font size="2"&gt;对于中间支持用户怎么去操作数据，不是我们这里讨论的重点，这也是随业务逻辑而变的，一般都会在功能上做成和线上的系统一样&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;strong&gt;1.业务数据同步到本地&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;将云上的业务上的数据按需同步到本地并不是什么难的操作，但是这里也不容小觑&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;技术实现要点：&lt;/font&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;font size="2"&gt;能够按需选择数据同步到本地，为了让用户不用花大量的时间在等待同步数据到本地，我们可以采用由用户选择数据的同步 机制，有选择的将真正对用户有用的数据同步到本地，当然我们在代码逻辑中，还需要记住用户的这些选择，并持久化，为用户回到公司进行数据提交提供处理基础 &lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;离线客户端数据暂存器能够实现数据的持久化 &lt;/font&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Creator/201107/201107131640462844.jpg"&gt;&lt;font size="2"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; margin-right: auto; margin-left: auto; float: none; display: block;background-image: none;" title="offline-app01" border="0" alt="offline-app01" src="http://images.cnblogs.com/cnblogs_com/Creator/201107/201107131640487695.jpg" width="460" height="290" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;业务数据同步到本地除了上面涉及到的，实际上我们还必须解决差异同步问题&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;虽然我们在同步业务数据到本地的时候，用户可以按需进行选择，但是如果用户当前选择的数据，有若干数据已经在本地有副本了，这些应该怎么处理呢？差异同步的实现不知道大家有没有比较好的方案，我这里提供一点拙见&lt;/font&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;font size="2"&gt;最笨的方法就是遍历然后依次判断个属性是否相等，若发现在本地有副本，则跳到下一个业务数据条目，继续运行， &lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;使用version法，给每个业务数据条目都加上一个version，对业务数据条目的任何更改都会引起version++，这样我们就可以通过判断version来确定,而且我们可以使用截获事件的手段来避免version给我们带来业务逻辑上的任何变化 &lt;/font&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;strong&gt;2.提交数据到业务系统&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;这里主要是员工回到公司后，系统对员工已经在线下所作的更改提交到业务系统，产生效果&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;技术实现要点：&lt;/font&gt;&lt;/p&gt;  &lt;ul dir="ltr"&gt;&lt;li&gt;&lt;div style="margin-right: 0px;"&gt;&lt;font size="2"&gt;找到那些已经被更改的数据，我们这里拟采用&amp;#8220;已更改数据&amp;#8221;存储模块来标识用户已经做了更改的数据条目，这样可以获得更快的速度，我们可以在最短的时间找到哪些数据做了更改&lt;/font&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="margin-right: 0px;"&gt;&amp;nbsp;&lt;font size="2"&gt;提交到服务器，在服务器上找到那些已更改的数据条目，应用用户最新的处理结果，若在用户离线之后，别的用户对线上的数据做了一些修改，我们应该怎么处理呢？我们现在暂定的一个原则就是以用户最后更改为最新数据，当然，这方面确实会有一点点不妥，不知道大家有没有什么比较好的方案。&lt;/font&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&amp;nbsp; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Creator/201107/201107131640497912.jpg"&gt;&lt;font size="2"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; margin-right: auto; margin-left: auto; float: none; display: block;background-image: none;" title="offline-app02" border="0" alt="offline-app02" src="http://images.cnblogs.com/cnblogs_com/Creator/201107/201107131640495894.jpg" width="466" height="316" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;    &lt;img src="http://www.cnblogs.com/Creator/aggbug/2105477.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Creator/archive/2011/07/13/2105477.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Creator/archive/2011/06/18/2084267.html</id><title type="text">算法系列总结：分而治之——分治算法</title><summary type="text">分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题，这些子问题相互独立且与原问题性质相同。求出子问题的解，就可得到原问题的解。分治法解题的一般步骤： （1）分解，将要解决的问题划分成若干规模较小的同类问题； （2）求解，当子问题划分得足够小时，用较简单的方法解决； （3）合并，按原问题的要求，将子问题的解逐层合并构成原问题的解。一言以蔽之：分治法的设计思想是，将一个难以直接解决的大问题，分割成一些规模较小的相同问题，以便各个击破，分而治之。在认识分治之前很有必要先了解一下递归，当然，递归也是最基本的编程问题，一般接触过编程的人都会对递归有一些认识.为什么要先了解递归呢？你看，.</summary><published>2011-06-18T08:11:00Z</published><updated>2011-06-18T08:11:00Z</updated><author><name>大熊 | Zealot Yin</name><uri>http://www.cnblogs.com/Creator/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Creator/archive/2011/06/18/2084267.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Creator/archive/2011/06/18/2084267.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题，这些子问题相互独立且与原问题性质相同。求出子问题的解，就可得到原问题的解。&lt;/p&gt;&lt;p&gt;分治法解题的一般步骤： &lt;/p&gt;&lt;p&gt;（1）分解，将要解决的问题划分成若干规模较小的同类问题； &lt;/p&gt;&lt;p&gt;（2）求解，当子问题划分得足够小时，用较简单的方法解决； &lt;/p&gt;&lt;p&gt;（3）合并，按原问题的要求，将子问题的解逐层合并构成原问题的解。&lt;/p&gt;&lt;p&gt;一言以蔽之：分治法的设计思想是，&lt;font color="#ff0000"&gt;将一个难以直接解决的大问题，分割成一些规模较小的相同问题，以便各个击破，分而治之&lt;/font&gt;。&lt;/p&gt;&lt;p&gt;在认识分治之前很有必要先了解一下递归，当然，递归也是最基本的编程问题，一般接触过编程的人都会对递归有一些认识.为什么要先了解递归呢？你看，根据上面所说的，我们就要将一个问题分成若干个小问题，然后一一求解并且最后合并，这就是一个递归的问题，递归的去分解自身，递归的去解决每一个小问题，然后合并&amp;#8230;&lt;/p&gt;&lt;p&gt;关于递归,这里举一个最简单的例子，求N！；&lt;/p&gt;&lt;p&gt;我们只需要定义函数&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;int calculate(int n) &lt;/p&gt;&lt;p&gt;{ &lt;/p&gt;&lt;p&gt;if(n==1) &lt;/p&gt;&lt;p&gt;return 1; &lt;/p&gt;&lt;p&gt;else &lt;/p&gt;&lt;p&gt;&amp;nbsp; return n*calculate(n-1);&amp;nbsp;&amp;nbsp; //调用自身&amp;#8230; &lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;好了，有了递归的铺垫，我们下来来看一看一个分治算法的问题，&lt;font color="#ff0000"&gt;归并排序&lt;/font&gt;问题&amp;#8230;&lt;/p&gt;&lt;p&gt;基本思想：&lt;/p&gt;&lt;p&gt;将待排序元素分成大小大致相同的2个子集合(递归直到最小的排序单元），分别对2个子集合进行排序，最终将排好序的子集合合并成为所要求的排好序的集合。&lt;/p&gt;&lt;p&gt;下面我们用一张图来展示整个流程,最下面的（姑且叫他第一层）是原始数组分成了8个最小排序问题，各自只有一个元素，故不需要排序，大家可以看到，我们通过分而治之的思想把对最初数组的排序分为了若干个只有一个元素的小数组的排序,然后第二层,我们进行了合并，将每两个最小排序结果合并为有两个元素的数组,然后逐层往上进行合并，就有了最后的结果&amp;#8230;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;a href="http://images.cnblogs.com/cnblogs_com/Creator/201106/201106181603595079.gif"&gt;&lt;img title="mergeSort" border="0" alt="mergeSort" src="http://images.cnblogs.com/cnblogs_com/Creator/201106/201106181603597936.gif" width="686" height="396" style="border-top-style: initial; border-right-style: initial; border-bottom-style: initial; border-left-style: initial; background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; " /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;下面我们来看一下这个算法的具体实现，下面的MERGE-SORT (&lt;em&gt;A&lt;/em&gt;, &lt;em&gt;p&lt;/em&gt;, &lt;em&gt;r&lt;/em&gt;)表示对数组A[p-&amp;gt;r]的排序过程.其中p-&amp;gt;r代表从p到r.&lt;/p&gt;&lt;p&gt;MERGE-SORT (&lt;em&gt;A&lt;/em&gt;, &lt;em&gt;p&lt;/em&gt;, &lt;em&gt;r&lt;/em&gt;) &lt;/p&gt;&lt;p&gt;1.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF &lt;em&gt;p&lt;/em&gt; &amp;lt; &lt;em&gt;r&lt;/em&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 进行A[p-&amp;gt;r]的排序过程自然需要p&amp;lt;r的前提条件&lt;/p&gt;&lt;p&gt;2.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; THEN &lt;em&gt;q&lt;/em&gt; = [(&lt;em&gt;p&lt;/em&gt; + &lt;em&gt;r&lt;/em&gt;)/2]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/p&gt;&lt;p&gt;3.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MERGE-SORT (A, &lt;em&gt;p&lt;/em&gt;, &lt;em&gt;q&lt;/em&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; //继续递归看能不能将问题继续一分为二，处理A[p-&amp;gt;q]的排序&lt;/p&gt;&lt;p&gt;4.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MERGE-SORT (A, &lt;em&gt;q&lt;/em&gt; + 1, &lt;em&gt;r&lt;/em&gt;)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 继续递归看能不能将问题继续一分为二处理A[q+1-&amp;gt;r]的排序&lt;/p&gt;&lt;p&gt;5.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MERGE (A, &lt;em&gt;p&lt;/em&gt;, &lt;em&gt;q&lt;/em&gt;, &lt;em&gt;r&lt;/em&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 合并当前结果&lt;/p&gt;&lt;p&gt;到这里，分治算法的精髓已经出来了，我们&lt;font color="#ff0000"&gt;通过递归将问题进行分解到足够小&amp;#8230;继而进行结果计算&amp;#8230;然后再将结果合并.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;下面来处理一下边角料的工作，呵呵，让大家看到一个完整的归并排序的例子，整个算法总结系列我都没有很好的使用伪代码，而是使用我认为广泛使用的C语言代码来进行代码诠释.实际上，描述算法最好还是使用伪代码比较好，这里我对我前面的四篇文章没有使用伪代码而小小的鄙视一下自己，太不专业了..呵呵&lt;/p&gt;&lt;p&gt;以下算法MERGE (&lt;em&gt;A&lt;/em&gt;, &lt;em&gt;p&lt;/em&gt;, &lt;em&gt;q&lt;/em&gt;, &lt;em&gt;r&lt;/em&gt; )表示合并A[p-&amp;gt;q]和A[q+1-&amp;gt;r]这两个已经排序好的数组&lt;/p&gt;&lt;p&gt;MERGE (&lt;em&gt;A&lt;/em&gt;, &lt;em&gt;p&lt;/em&gt;, &lt;em&gt;q&lt;/em&gt;, &lt;em&gt;r&lt;/em&gt; )&lt;/p&gt;&lt;p&gt;1.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;em&gt;n&lt;/em&gt;&lt;sub&gt;1&lt;/sub&gt; &amp;#8592; &lt;em&gt;q&lt;/em&gt; &amp;#8722; &lt;em&gt;p&lt;/em&gt; + 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //计算A[p-&amp;gt;q]的长度 &lt;br /&gt;2.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;em&gt;n&lt;/em&gt;&lt;sub&gt;2&lt;/sub&gt; &amp;#8592; &lt;em&gt;r&lt;/em&gt; &amp;#8722; &lt;em&gt;q&lt;/em&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //计算A[q+1-&amp;gt;r]的长度 &lt;br /&gt;3.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Create arrays L[1 . . &lt;em&gt;n&lt;/em&gt;&lt;sub&gt;1&lt;/sub&gt; + 1] and R[1 . . &lt;em&gt;n&lt;/em&gt;&lt;sub&gt;2&lt;/sub&gt; + 1]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //创建两个数组 &lt;br /&gt;4.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;FOR&lt;/strong&gt; &lt;em&gt;i&lt;/em&gt; &amp;#8592; 1 &lt;strong&gt;TO&lt;/strong&gt; &lt;em&gt;n&lt;/em&gt;&lt;sub&gt;1&lt;/sub&gt; &lt;br /&gt;5.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;DO&lt;/strong&gt; L[&lt;em&gt;i&lt;/em&gt;] &amp;#8592; A[&lt;em&gt;p&lt;/em&gt; + &lt;em&gt;i&lt;/em&gt; &amp;#8722; 1] &lt;br /&gt;6.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;FOR&lt;/strong&gt; &lt;em&gt;j&lt;/em&gt; &amp;#8592; 1 &lt;strong&gt;TO&lt;/strong&gt; &lt;em&gt;n&lt;/em&gt;&lt;sub&gt;2&lt;/sub&gt; &lt;br /&gt;7.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;DO&lt;/strong&gt; R[&lt;em&gt;j&lt;/em&gt;] &amp;#8592; A[&lt;em&gt;q&lt;/em&gt; + &lt;em&gt;j&lt;/em&gt; ]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //4-7行是将原数组中A[p-&amp;gt;r]的元素取出到新创建的数组，我们的操作是基于临时数组的操作 &lt;br /&gt;8.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; L[&lt;em&gt;n&lt;/em&gt;&lt;sub&gt;1&lt;/sub&gt; + 1] &amp;#8592; &amp;#8734; &lt;br /&gt;9.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; R[&lt;em&gt;n&lt;/em&gt;&lt;sub&gt;2&lt;/sub&gt; + 1] &amp;#8592; &amp;#8734;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //8-9行设置界限.. &lt;br /&gt;10.&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;em&gt;i &lt;/em&gt;&amp;#8592; 1 &lt;br /&gt;11.&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;em&gt;j&lt;/em&gt; &amp;#8592; 1 &lt;br /&gt;12.&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;FOR&lt;/strong&gt; &lt;em&gt;k&lt;/em&gt; &amp;#8592; &lt;em&gt;p&lt;/em&gt; &lt;strong&gt;TO&lt;/strong&gt; &lt;em&gt;r&lt;/em&gt; &lt;br /&gt;13.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;DO IF&lt;/strong&gt; L[&lt;em&gt;i&lt;/em&gt; ] &amp;#8804; R[ &lt;em&gt;j&lt;/em&gt;] &lt;br /&gt;14.&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;strong&gt;THEN&lt;/strong&gt; A[&lt;em&gt;k&lt;/em&gt;] &amp;#8592; L[&lt;em&gt;i&lt;/em&gt;] &lt;br /&gt;15.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;em&gt;i&lt;/em&gt; &amp;#8592; &lt;em&gt;i&lt;/em&gt; + 1 &lt;br /&gt;16.&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;strong&gt;ELSE&lt;/strong&gt; A[k] &amp;#8592; R[j] &lt;br /&gt;17.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;em&gt;j&lt;/em&gt; &amp;#8592; &lt;em&gt;j&lt;/em&gt; + 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //12-17行进行排序合&lt;/p&gt;&lt;p&gt;这里我还是提供一个具体的实现，请见下面的代码&lt;/p&gt;&lt;p&gt;C语言代码&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('566a7e49-22ac-40de-95fc-691484731d81')"&gt;&lt;img style="display: none" id="code_img_opened_566a7e49-22ac-40de-95fc-691484731d81" class="code_img_opened" onclick="cnblogs_code_hide('566a7e49-22ac-40de-95fc-691484731d81',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&lt;div id="cnblogs_code_open_566a7e49-22ac-40de-95fc-691484731d81" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;span style="color: #000000"&gt;关于代码注释，请见博客上面的伪代码注释..&lt;br /&gt;#include&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;stdio.h&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;L[&lt;/span&gt;&lt;span style="color: #800080"&gt;100&lt;/span&gt;&lt;span style="color: #000000"&gt;],R[&lt;/span&gt;&lt;span style="color: #800080"&gt;100&lt;/span&gt;&lt;span style="color: #000000"&gt;];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;merge(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;numbers[],&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;left,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;mid,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;right)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;n1&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;mid&lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt;left&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&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;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;n2&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;right&lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt;mid;&lt;br /&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;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;i,j,k;&lt;br /&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;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;(i&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;;i&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;n1;i&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&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;&amp;nbsp;L[i]&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;numbers[left&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;i&lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;];&lt;br /&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;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;(&amp;nbsp;j&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;;j&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;n2;j&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&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;&amp;nbsp;R[j]&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;numbers[mid&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;j];&lt;br /&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;L[n1&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800080"&gt;99999&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&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;R[n2&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800080"&gt;99999&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&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;br /&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;i&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&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;j&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&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;br /&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;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;(k&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;left;k&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;right;k&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&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;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(L[i]&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;R[j])&lt;br /&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;numbers[k]&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;L[i];&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&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;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;numbers[k]&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;R[j];&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&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;&amp;nbsp;&amp;nbsp;&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;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;mergeSort(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;numbers[],&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;left,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;right)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(left&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;right)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;mid;&lt;br /&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;mid&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(right&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;left)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;/&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&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;mergeSort(numbers,&amp;nbsp;left,&amp;nbsp;mid);&lt;br /&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;mergeSort(numbers,&amp;nbsp;mid&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;right);&lt;br /&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;merge(numbers,left,&amp;nbsp;mid,&amp;nbsp;right);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;numbers[]&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800080"&gt;5&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;4&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;6&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;3&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;6&lt;/span&gt;&lt;span style="color: #000000"&gt;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mergeSort(numbers,&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;7&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;i&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;i&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800080"&gt;8&lt;/span&gt;&lt;span style="color: #000000"&gt;;i&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;%d&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,numbers[i]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;C#代码&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('c0082f1e-f0ce-486d-8de5-7046395d0472')"&gt;&lt;img style="display: none" id="code_img_opened_c0082f1e-f0ce-486d-8de5-7046395d0472" class="code_img_opened" onclick="cnblogs_code_hide('c0082f1e-f0ce-486d-8de5-7046395d0472',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&lt;div id="cnblogs_code_open_c0082f1e-f0ce-486d-8de5-7046395d0472" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Program&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;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;[]&amp;nbsp;L&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;&lt;span style="color: #800080"&gt;100&lt;/span&gt;&lt;span style="color: #000000"&gt;];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;[]&amp;nbsp;R&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;&lt;span style="color: #800080"&gt;100&lt;/span&gt;&lt;span style="color: #000000"&gt;];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;merge(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;[]&amp;nbsp;numbers,&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;left,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;mid,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;right)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;n1&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;mid&lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt;left&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&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;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;n2&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;right&lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt;mid;&lt;br /&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;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;i,j,k;&lt;br /&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;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;(i&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;;i&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;n1;i&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&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;&amp;nbsp;L[i]&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;numbers[left&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;i&lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;];&lt;br /&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;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;(&amp;nbsp;j&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;;j&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;n2;j&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&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;&amp;nbsp;R[j]&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;numbers[mid&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;j];&lt;br /&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;L[n1&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800080"&gt;99999&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&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;R[n2&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800080"&gt;99999&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&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;br /&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;i&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&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;j&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&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;br /&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;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;(k&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;left;k&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;right;k&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&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;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(L[i]&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;R[j])&lt;br /&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;numbers[k]&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;L[i];&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&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;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;numbers[k]&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;R[j];&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&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;&amp;nbsp;&amp;nbsp;&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;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;mergeSort(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;[]&amp;nbsp;numbers,&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;left,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;right)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(left&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;right)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;mid;&lt;br /&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;mid&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(right&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;left)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;/&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&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;mergeSort(numbers,&amp;nbsp;left,&amp;nbsp;mid);&lt;br /&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;mergeSort(numbers,&amp;nbsp;mid&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;right);&lt;br /&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;merge(numbers,left,&amp;nbsp;mid,&amp;nbsp;right);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Main(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;[]&amp;nbsp;args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;[]&amp;nbsp;numbers&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800080"&gt;5&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;4&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;6&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;3&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;6&lt;/span&gt;&lt;span style="color: #000000"&gt;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mergeSort(numbers,&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;7&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;i&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;i&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800080"&gt;8&lt;/span&gt;&lt;span style="color: #000000"&gt;;i&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.Write(numbers[i]);&lt;br /&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;br /&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;br /&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;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;TODO:&amp;nbsp;Implement&amp;nbsp;Functionality&amp;nbsp;Here&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&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;br /&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;Console.Write(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Press&amp;nbsp;any&amp;nbsp;key&amp;nbsp;to&amp;nbsp;continue&amp;nbsp;.&amp;nbsp;.&amp;nbsp;.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&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;Console.ReadKey(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;归并排序算法的时间复杂度是O（nlogn）,对于冒泡排序的O(n*n),效率还有有比较好的提高..&lt;/p&gt;&lt;p&gt;其实本人原来在学习的时候好长一段时间不理解为什么时间复杂度会是O（nlogn）,像冒泡排序就比较好理解，有两个for循环，问题的规模随着n变大而变大，算法时间复杂度自然就是O(n*n),后面花了一些时间来阅读一些资料才明白其原理，这里我已经将资料地址放到了本文最后，有兴趣的也可以去看看.简单的描述一下为什么会是O（nlogn）&lt;/p&gt;&lt;p&gt;大家看看，我们的例子，解一个8个元素的数组，我们用到了几层？是四层，假设我们这里有n个元素，我们会用到多少层？根据一定的归纳总结，我们知道我们会用到(lgn)+1层..(lgn)+1层需要用到lgn层次的合并算法.现在再看看MERGE (&lt;em&gt;A&lt;/em&gt;, &lt;em&gt;p&lt;/em&gt;, &lt;em&gt;q&lt;/em&gt;, &lt;em&gt;r&lt;/em&gt; )的复杂度是多少，毫无疑问O（n），故其归并排序的算法时间复杂度是O（nlogn）.当然这个结果还可以通过其他的方法计算出来，我这里是口语话最简洁的一种..&lt;/p&gt;&lt;p&gt;下面来一张算法时间复杂度的与n规模的关系图..&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Creator/201106/201106181603594589.gif"&gt;&lt;img style="background-image: none; border-bottom-width: 0px; border-bottom-style: initial; border-left-width: 0px; border-left-style: initial; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-top-style: initial; border-right-width: 0px; border-right-style: initial; padding-top: 0px; border-color: initial; " title="mergeGraph" border="0" alt="mergeGraph" src="http://images.cnblogs.com/cnblogs_com/Creator/201106/201106181603598525.gif" width="567" height="314" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;引用资料：&lt;a title="http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/Sorting/mergeSort.htm" href="http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/Sorting/mergeSort.htm"&gt;http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/Sorting/mergeSort.htm&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="page-break-before: always; background-color: #c0c0c0; height: 1px; font-size: 1px; vertical-align: middle" title="Print Page Break"&gt;&amp;nbsp; &lt;/div&gt;&lt;p&gt;&amp;nbsp;算法系列目录：&lt;/p&gt;&lt;p&gt;1.&lt;a id="ctl04_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/Creator/archive/2011/06/18/2084267.html"&gt;&lt;font color="#f56400" size="4" face="Arial"&gt;算法系列总结：分治算法&lt;/font&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;2.&lt;a id="homepage1_HomePageDays_DaysList_DayItem_0_DayList_0_TitleUrl_0" class="postTitle2" href="http://www.cnblogs.com/Creator/archive/2011/06/07/2074227.html"&gt;&lt;font color="#f56400" size="4" face="Arial"&gt;算法系列总结：贪心算法&lt;/font&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;3.&lt;a id="homepage1_HomePageDays_DaysList_DayItem_4_DayList_4_TitleUrl_0" class="postTitle2" href="http://www.cnblogs.com/Creator/archive/2011/05/17/2048302.html"&gt;&lt;font color="#f56400" size="4" face="Arial"&gt;算法系列总结：动态规划(解公司外包成本问题）&lt;/font&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;4.&lt;a id="homepage1_HomePageDays_DaysList_DayItem_3_DayList_3_TitleUrl_0" class="postTitle2" href="http://www.cnblogs.com/Creator/archive/2011/05/20/2052341.html"&gt;&lt;font color="#f56400" size="4" face="Arial"&gt;算法系列总结：回溯算法（解火力网问题）&lt;/font&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;5.&lt;a id="homepage1_HomePageDays_DaysList_DayItem_2_DayList_2_TitleUrl_0" class="postTitle2" href="http://www.cnblogs.com/Creator/archive/2011/05/21/2053033.html"&gt;&lt;font color="#f56400" size="4" face="Arial"&gt;算法系列总结：分支限界算法&lt;/font&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Creator/aggbug/2084267.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Creator/archive/2011/06/18/2084267.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
