<?xml version="1.0" encoding="UTF-8" ?>
  <rss version="2.0">
    <channel>

<title>油库7号</title>
      <link>http://neoajk.ycool.com/</link>
      <description><![CDATA[]]></description>
      <pubDate>Thu, 02 Jul 2009 03:07:53 GMT</pubDate>
      <lastBuildDate>Thu, 02 Jul 2009 03:07:53 GMT</lastBuildDate>
      <image>
        <url>http://sta.yculblog.com/images/logo/general-88x31.gif</url>
        <title>油库7号</title>
        <link>http://neoajk.ycool.com/</link>
      </image>
<item>
        <title>他的国</title>
        <link>http://neoajk.ycool.com/post.2378591.html</link>
        <description><![CDATA[你能发光，你应该飞在我的前面。<br />
<br />
<br />
<br />
<br />
<embed src="http://www.flitigalisa.net/People.mp3" width="100" height="45" type="audio/mpeg" loop="true" autostart="false" play="true"></embed>...
]]></description>
        <guid isPermaLink="true">http://neoajk.ycool.com/post.2378591.html</guid>
        <pubDate>Fri, 19 Jun 2009 08:06:11 GMT</pubDate>

      </item>

      <item>
        <title>静谧时光</title>
        <link>http://neoajk.ycool.com/post.2197953.html</link>
        <description><![CDATA[<img height="377" alt="" width="377" border="0" src="http://node3.foto.ycstatic.com/200812/18/b/27356203.jpg" /><br />
<br />
<img height="377" alt="" width="377" border="0" src="http://node3.foto.ycstatic.com/200812/18/a/27356202.jpg" /><br />
<br />
<img height="237" alt="" width="377" border="0" src="http://node3.foto.ycstatic.com/200812/18/9/27356201.jpg" /><br />
<br />
<embed src="http://ihab.allmyblog.com/images/ihab/ihab_20081203_144100.mp3" width="100" height="45" type="audio/mpeg" play="true" autostart="false" loop="true"></embed><br />...
]]></description>
        <guid isPermaLink="true">http://neoajk.ycool.com/post.2197953.html</guid>
        <pubDate>Thu, 18 Dec 2008 07:12:59 GMT</pubDate>
<category>dido</category>

        <category>quiet times</category>

        <category>《safe trip home》</category>
      </item>

      <item>
        <title>那儿风光明媚</title>
        <link>http://neoajk.ycool.com/post.2194248.html</link>
        <description><![CDATA[<p><img alt="" border="0" src="http://www.91now.com/down/upload/2008-9-27/20089271811890971.jpg" /></p>
<br />
<br />
<br />
我喜欢这样的电影。象夏日微风，抑或冬日暖阳。<br />
<br />
<br />
<embed src="http://img.iwe.com.cn/img1/2009/0320/115186bd.mp3" width="100" height="45" type="audio/mpeg" loop="true" autostart="false" play="true"></embed>...
]]></description>
        <guid isPermaLink="true">http://neoajk.ycool.com/post.2194248.html</guid>
        <pubDate>Fri, 12 Dec 2008 06:12:22 GMT</pubDate>
<category>海角七号</category>
      </item>

      <item>
        <title>鸽子在眼睛深处飞翔</title>
        <link>http://neoajk.ycool.com/post.2192431.html</link>
        <description><![CDATA[须一瓜，是这几年我喜欢的小说作者。从2004年的时候读到她的《<a href="http://fifid.com/search/%E9%B8%BD%E5%AD%90%E9%A3%9E%E7%BF%94%E5%9C%A8%E7%9C%BC%E7%9D%9B%E6%B7%B1%E5%A4%84?src=yb_qsal&utm_source=yb_qsal&utm_medium=link&utm_content=rsspost" target="_blank">鸽子飞翔在眼睛深处</a>》开始就非常喜欢。<br />
她的很多作品，甚至从名字开始，我就很喜欢。<br />
&ldquo;好的小说一如好的小说家，是古怪的天使，是上帝的格外恩赐！&rdquo;<br />
<br />
<br />...
]]></description>
        <guid isPermaLink="true">http://neoajk.ycool.com/post.2192431.html</guid>
        <pubDate>Tue, 09 Dec 2008 05:12:09 GMT</pubDate>
<category>鸽子飞翔在眼睛深处</category>

        <category>提拉米酥</category>

        <category>须一瓜</category>

        <category>淡绿色月亮</category>

        <category>你是我公元前的熟人</category>

        <category>穿过欲望的撒水车</category>
      </item>

      <item>
        <title>where is my mind</title>
        <link>http://neoajk.ycool.com/post.2159427.html</link>
        <description><![CDATA[<img alt="" border="0" src="http://node1.foto.ycstatic.com/200810/14/c/27121404.jpg" /><br />
<embed src="http://www.phoenix-quill.com/sounds/covercomplete.mp3" width="500" height="45" type="audio/mpeg" play="true" autostart="false" loop="true"></embed><br />
<br />...
]]></description>
        <guid isPermaLink="true">http://neoajk.ycool.com/post.2159427.html</guid>
        <pubDate>Tue, 14 Oct 2008 02:10:47 GMT</pubDate>
<category>where is my mind</category>
      </item>

      <item>
        <title>5分钟的UFO</title>
        <link>http://neoajk.ycool.com/post.2159424.html</link>
        <description><![CDATA[<p><font face="Arial">五分钟以前 <br />
天空被一条狭长的云划破<br />
此刻什么也没有</font></p>
<p><font face="Arial">太阳在落日的方向出现<br />
闪烁着光芒的飞行物<br />
在高空 缓慢移动<br />
幽灵般 安静地一前一后</font></p>
<p><font face="Arial">五分钟以后的天空<br />
开始逐渐蓝得通透<br />
我开始想着 <br />
要赶紧告诉你<br />
今天 我目击了UFO</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2008.10</font></p>
<br />...
]]></description>
        <guid isPermaLink="true">http://neoajk.ycool.com/post.2159424.html</guid>
        <pubDate>Tue, 14 Oct 2008 02:10:03 GMT</pubDate>
<category>ufo</category>

        <category>不明飞行物</category>
      </item>

      <item>
        <title>Programing Server-Side Applications for Microsoft windows 2000(IOCP部分)</title>
        <link>http://neoajk.ycool.com/post.2089589.html</link>
        <description><![CDATA[<p><font face="Arial">Programing Server-Side Applications for Microsoft windows 2000<br />
Part 1 Required reading<br />
Chapter 2 Device I/O and interthread communication</font></p>
<p><font face="Arial">Receiving Completed I/O Requested Notifications<br />
</font></p>
<br />
<p><font face="Arial">Creating an I/O Completion Port<br />
I/O完成端口背后的理论是同时运行的线程数必须有个上界；也就是，500个并发的客户端请求不必要500个线程存在。那么，合适的并发线程数是多少呢？你会意识到，如果一个机器有两个CPU，那么在此基础上多余两个以上的线程实在是没有意义。因为，当有超过CPU数量的线程数时，系统不得不耗费时间来进行线程之间的切换，这会浪费宝贵的CPU时钟周期。<br />
为每个客户端创建一个线程还有一个不足，就是创建一个线程虽然比创建一个进程廉价，但它远远不是免费的。如果服务器应用程序在启动时创建一个线程池，并且池子中的线程留驻在程序的整个生命期内，那么服务器的性能会得到提高。I/O完成端口在设计上就是使用了线程池。<br />
I/O完成端口可能是最复杂的核心对象。要创建一个完成端口你可以使用CreateIoCompletionPort函数。</font></p>
<p><font face="Arial">HANDLE CreateIoCompletionPort(<br />
&nbsp;&nbsp; HANDLE&nbsp;&nbsp;&nbsp; hfile,<br />
&nbsp;&nbsp; HANDLE&nbsp;&nbsp;&nbsp; hExistingCompPort, <br />
&nbsp;&nbsp; ULONG_PTR CompKey,<br />
&nbsp;&nbsp; DWORD&nbsp;&nbsp;&nbsp;&nbsp; dwNumberOfConcurrentThreads);<br />
&nbsp;&nbsp;&nbsp; <br />
或者封装：<br />
HANDLE CreateNewCompletionPort(DWORD dwNumberOfConcurrentThreads) {</font></p>
<p><font face="Arial">&nbsp;&nbsp; return(CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwNumberOfConcurrentThreads));<br />
}</font></p>
<p><font face="Arial">这个函数根据传入的参数的不同，可以完成两个完全不同的功能。一是可以创建一个完成端口，另一个是可以将一个设备与完成端口关联起来。例如要产生一个完成端口，看起来可以这样调用函数：<br />
hCompPort = CreateIoCompletionPort(<br />
&nbsp;&nbsp;&nbsp;INVALID_HANDLE_VALUE,<br />
&nbsp;&nbsp;&nbsp;NULL,<br />
&nbsp;&nbsp;&nbsp;0,<br />
&nbsp;&nbsp;&nbsp;0);</font></p>
<p><font face="Arial">FileHandle &mdash;&mdash; 文件或设备的句柄。在产生完成端口时，这个参数应设置为INVALID_HANDLE_VALUE，于是产生一个没有和任何句柄有关系的port。<br />
ExistingCompletionPort &mdash;&mdash; 在产生完成端口时此参数设定为NULL，产生一个新的port。如果此参数指定为一个已存在的完成端口的句柄，那么在上一个参数FileHandle中指定的句柄就会被加到此port上，而不会产生新的port。<br />
CompletionKey &mdash;&mdash; 用户自定义的一个值，将被交给提供服务的线程。此值和FileHandle有关联。<br />
NumberOfConcurrentThreads &mdash;&mdash; 与此完成端口有关联的线程个数。如果设定为0则为CPU的个数。<br />
NumberOfConcurrentThreads这个参数是告诉完成端口可同时运行的最大线程数。如果传0，则默认值为CPU的个数。在大多数情况下为了避免不必要的线程切换你可以传0。有时你也许会想要增加这个值，那就是当来自客户端的请求需要一个长时间的计算甚至发生阻塞时，但通常不鼓励增加这个值。你可以尝试往这个参数传不同的值来测试比较服务器的性能。</font></p>
<p><font face="Arial">关联一个设备到完成端口<br />
当你创建完成端口时，系统内核会创建5个不同的数据结构.<br />
</font></p>
<p><font face="Arial">第一个数据结构是设备列表，指明了被关联到完成端口上的设备。将设备关联到完成端口上，你同样是调用CreateIoCompletionPort函数。看起来可以这样调用函数：<br />
HANDLE h = CreateIoCompletionPort(hDevice, hCompPort, dwCompKey, 0);</font></p>
<p><font face="Arial">或者封装：<br />
BOOL AssociateDeviceWithCompletionPort(<br />
&nbsp;&nbsp; HANDLE hCompPort, HANDLE hDevice, DWORD dwCompKey) {</font></p>
<p><font face="Arial">&nbsp;&nbsp; HANDLE h = CreateIoCompletionPort(hDevice, hCompPort, dwCompKey, 0);<br />
&nbsp;&nbsp; return(h == hCompPort);<br />
}<br />
这样就添加一个记录（entry）到一个已经存在的完成端口设备列表上。你在第一个参数上传递一个已经存在的完成端口句柄（在第一次调CreateIoCompletionPort时得到），在第二个参数上传递设备句柄(这个设备可以是file,socket,<br />
mailslot,pipe等等)，在第三个参数上传递一个完成键（由用户定义的值，操作系统不关心你传递的是什么值）。每当你关联一个设备到完成端口上时，系统就添加这些信息到完成端口设备列表上。<br />
注意：CreateIoCompletionPort很复杂，推荐把它看成两个函数来使用。下面有个例子把创建端口和关联放在一次调用中完成，但是不推荐这样使用。下面的代码在打开一个文件并在同一时间创建一个新的完成端口，同时关联该设备与完成端口。所有这个文件I/O请求都将在完成时使用CK_FILE这个完成键，完成端口将允许两个线程来并发执行。<br />
#define CK_FILE&nbsp;&nbsp; 1<br />
HANDLE hfile = CreateFile(...);<br />
HANDLE hCompPort = CreateIoCompletionPort(hfile, NULL, CK_FILE, 2);</font></p>
<font face="Arial">
<p><br />
第二个数据结构是一I/O完成队列。当针对一个设备的异步I/O请求完成时，系统就检查看这个设备在之前是否被关联到一个完成端口过，如果是，系统就将这个已经完成的I/O请求作为一条记录，添加到对应的完成端口的I/O完成队列末尾。在队列中的每条记录都指明了4个值：已传输的字节数；完成键（当设备被关联到端口上时通过第三个参数设定的）；一个指针，指向I/O请求的OVERLAPPED结构；和一个错误码。<br />
注意：对一个设备发出一个I/O请求，但并不将它记录到完成端口的完成队列上是可以的。这不是常态，但有时却派得上用场。比如，当你通过socket发送数据，但你并不在意这些数据是否被处理时。（或者有时候想用旧有的受激发的event对象机制来激发，而不用I/O完成队列）<br />
为了这么做，请你设定一个OVERLAPPED结构，内含一个合法的手动重置(manual-reset)event对象，放在hEvent栏位。然后把该handle的最低位设置为1。虽然这听起来象是一种黑客行为，但档案中有交代。看起来象这样：<br />
Overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);<br />
Overlapped.hEvent = (HANDLE) ((DWORD_PTR) Overlapped.hEvent | 1);<br />
ReadFile(..., &amp;Overlapped);</p>
<p>同样，不要忘记在关闭event句柄之前重置低位：<br />
CloseHandle((HANDLE) ((DWORD_PTR) Overlapped.hEvent &amp; ~1));</p>
<p><br />
Architecting Around an I/O Completion Port<br />
当你的服务器应用程序启动时，它将通过调用像CreateNewCompletionPort这样的函数来创建I/O完成端口。然后应用程序创建一个线程池来处理client请求。现在你有个问题要问，&ldquo;线程池中有多少线程？&rdquo;。这是一个很难回答的问题，我将在&ldquo;How Many Threads in the Pool?&rdquo;这个小节中给出详细的回答。目前，单凭经验的标准是本地机器上的CPU数再乘以2。比如，一个双CPU的机器上，你就应该在线程池中创建4个线程。<br />
池子里的所有线程都将执行相同的线程函数。通常，这个线程函数执行一些初始化工作，然后就进入一个循环，直到服务进程被指示停止时才结束掉。在循环里，线程将自己休眠，等待关联到完成端口上的设备的I/O请求完成。线程通过调用GetQueuedCompletionStatus函数进入等待。<br />
下面是函数原型：</p>
<p>BOOL GetQueuedCompletionStatus(<br />
&nbsp;&nbsp; HANDLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hCompPort,<br />
&nbsp;&nbsp; PDWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pdwNumBytes,<br />
&nbsp;&nbsp; PULONG_PTR&nbsp;&nbsp; CompKey,<br />
&nbsp;&nbsp; OVERLAPPED** ppOverlapped,<br />
&nbsp;&nbsp; DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwMilliseconds);<br />
第一个参数hCompPort传递一个完成端口句柄，表明线程监控的是哪一个完成端口。许多服务程序都是使用的单一完成端口，所有I/O请求的完成通知都在这一个端口上。基本上，GetQueuedCompletionStatus的工作就是将调用此函数的线程休眠，直到一条记录出现在指定完成端口上的I/O完成队列中，或者直到指定的超时时间到达（超时时间在dwMilliseconds参数中指定）。<br />
第三个数据结构就是等待中的线程队列（the waiting thread queue）。在线程池中的每一个调用了GetQueuedCompletionStatus的线程，其线程ID就被放置到等待中的线程队列里，以使I/O完成端口核心对象能知道当前有哪些线程正等待着处理已经完成了的I/O请求。当有一条记录出现在端口的I/O完成队列时，完成端口就唤醒一个在等待队列中的线程。这个线程会得到组成这条完成记录的一些信息：已传输的字节数，完成键，和一个OVERLAPPED结构的地址。这些信息通过传递给GetQueuedCompletionStatus函数的三个参数（pdwNumBytes、CompKey、ppOverlapped）返回到线程中。GetQueuedCompletionStatus函数的返回值有点复杂，下面的代码演示了如何处理不同的返回值：<br />
DWORD dwNumBytes;<br />
ULONG_PTR CompKey;<br />
OVERLAPPED* pOverlapped;</p>
<p>// hIOCP is initialized somewhere else in the program<br />
BOOL fOk = GetQueuedCompletionStatus(hIOCP,<br />
&nbsp;&nbsp; &amp;dwNumBytes, &amp;CompKey, &amp;pOverlapped, 1000);<br />
DWORD dwError = GetLastError();</p>
<p>if (fOk) {<br />
&nbsp;&nbsp; // Process a successfully completed I/O request<br />
} else {<br />
&nbsp;&nbsp; if (pOverlapped != NULL) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Process a failed completed I/O request<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // dwError contains the reason for failure<br />
&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (dwError == WAIT_TIMEOUT) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Time-out while waiting for completed I/O entry<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Bad call to GetQueuedCompletionStatus<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // dwError contains the reason for the bad call<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
}<br />
如你所预料到的，I/O完成队列是以队列的方式移出记录的，也就是先进先出FIFO。然而，你可能没有料到的是，调用GetQueuedCompletionStatus函数进入等待的线程却是以栈的方式来唤醒的，也就是LIFO，最后调用函数进入等待的那个线程被最先唤醒。这样做的理由是为了进一步提高处理性能。例如，有四个线程在&ldquo;等待线程队列&rdquo;中等待着。如果这个时候只有一条&ldquo;已完成的I/O&rdquo;记录出现了，那么最后一个调用GetQueuedCompletionStatus的线程被唤醒来处理这条记录。当这个线程处理完这条记录时，此线程再次调用GetQueuedCompletionStatus函数进入等待线程队列。那么，此时当有另一条I/O完成记录出现时，刚才那个线程被继续唤醒来处理这条新的记录。（这样的好处就是可以避免线程间的切换）<br />
只要I/O请求完成得够迟缓，那么单个线程就足以处理他们。系统只需要保持唤醒同一个线程，并让其他三个线程持续休眠。使用LIFO算法，线程就不必花时间将他们在内存中的资源置换到磁盘中（例如栈空间），并从CPU的cache中替换出去。</p>
<p>I/O完成端口如何管理线程池<br />
现在该讨论为什么完成端口是如此有用了。首先，在你创建完成端口的时候，你通过CreateIoCompletionPort函数的最后一个参数指定可以并行运行的线程数量。我们说过，这个值通常设置为主机上的CPU数量。当已经完成的I/O记录进入队列时，完成端口就唤醒等待中的线程。然而，完成端口只能唤醒你所指定的那么多个线程。于是，在双CPU的机器中，如果有4个I/O请求完成，并有4个线程在等待，但完成端口却只能唤醒2个线程，另2个线程保持休眠。每个得到唤醒在处理已完成的I/O记录的线程，处理完成后，又重新调用GetQueuedCompletionStatus函数进入等待。因为线程的唤醒算法是后进先出，所以系统看到还有已完成的I/O记录在排队时，又唤醒刚才被唤醒过的线程。<br />
仔细思考这个过程，你似乎会觉得好象有些问题：既然完成端口仅允许指定数量的线程被唤醒，为什么还要产生多余的线程等待在线程池中呢？比如，在上一段中所叙述的那种情况，在一个双CPU的主机上，创建一个完成端口，并告之只允许2个线程并行处理。但是创建线程池时我们创建了4个线程（按照2倍CPU的数量），看上去我们好象创建了2个多余的线程&mdash;&mdash;他们永远也不会被唤醒。（因为LIFO）<br />
但是不用担心，完成端口是非常聪明的。当完成端口唤醒一个线程时，会将此线程的ID放入第四个数据结构中&mdash;&mdash;被释放的线程列表。这可以让完成端口记住哪些线程是被唤醒了的，并监控这些线程的执行。如果某个在&ldquo;被释放的线程列表&rdquo;中的线程因为调用了某功能而被挂起（即产生阻塞）那么完成端口会侦测到这一情况，并将此线程的ID从&ldquo;被释放的线程列表&rdquo;中移动到&ldquo;暂停的线程列表&rdquo;&mdash;&mdash;即第五个数据结构中。<br />
完成端口的目标就是要保证在&ldquo;被释放的线程列表&rdquo;中的记录条数保持为你在创建完成端口时所指定的并发线程数。因此，当一个被唤醒的线程因为某种原因而被挂起时，完成端口就会释放掉另一个在等待中的线程，以次来维持&ldquo;被释放的线程列表&rdquo;中的记录数保持为你所指定的并发线程数。如果被挂起的线程重新被唤醒，它又会从&ldquo;暂停的线程列表&rdquo;中移动到&ldquo;被释放的线程列表&rdquo;。这个时候需要注意的是加上刚才被另外唤醒的一个线程，此时在&ldquo;被释放的线程列表&rdquo;中的记录数会超过你所指定的并发线程数（看上去很奇怪，但却是这样）。完成端口意识到这一情况后将不会再唤醒其他线程，除非并行线程数又降到CPU数量之下。实际并行线程数将只在你指定的最大并行线程数之上停留很短的时间并且线程在循环到再次调用GetQueuedCompletionStatus时这种情况将快速的停止下来。<br />
注意：一旦线程调用GetQueuedCompletionStatus，那么这个线程就被&ldquo;分配&rdquo;到那指定的完成端口上去。系统会假定那些被&ldquo;分配&rdquo;的线程代表完成端口在工作。你可以终止线程和完成端口间的这种&ldquo;分配&rdquo;关系，通过以下三种方式：<br />
&nbsp;终止线程；<br />
&nbsp;让线程调用GetQueuedCompletionStatus，并传递另一个完成端口的句柄，这样就终止掉当前的&ldquo;分配&rdquo;关系，与另一完成端口产生新的&ldquo;分配&rdquo;关系。<br />
&nbsp;销毁完成端口。</p>
<p>在线程池中创建多少个线程？<br />
现在是讨论线程池中需要多少个线程的好时机。考虑两点：首先，当服务程序启动时你应该创建一个最小的线程集，这样你就不用象每客户端每线程模型那样频繁地创建和销毁线程了。因为创建和销毁线程都需要耗费CPU时间，所以你应该尽可能的少做这些操作。其次，你应该设置线程数的最大值，因为创建太多的线程会相应耗费太多的系统资源。就算大多数资源能被交换出RAM，但你还是应该最小限度地使用系统资源，不要浪费，最好不要产生paging file space。<br />
你也许应该测试不同的线程数。大多数服务程序（包括MS的IIS）都使用启发式（heuristic，实际就是枚举选择，通过可选择的方法发现的几种解决办法中最合适的一种，在一个程序的连续阶段被选择出来以用于该程序的下一步的一种解决问题的技巧的应用）算法来管理他们的线程池。我推荐你也使用同样的方法。例如，你可以创建如下的变量来管理线程池。<br />
LONG g_nThreadsMin;&nbsp;&nbsp;&nbsp; // Minimum number of threads in pool<br />
LONG g_nThreadsMax;&nbsp;&nbsp;&nbsp; // Maximum number of threads in pool<br />
LONG g_nThreadsCrnt;&nbsp;&nbsp; // Current number of threads in pool<br />
LONG g_nThreadsBusy;&nbsp;&nbsp; // Number of busy threads in pool</p>
<p>当你的程序启动时，你可以创建g_nThreadsMin这么多个线程，都执行相同的线程函数。线程函数看起来是这样：<br />
DWORD WINAPI ThreadPoolFunc(PVOID pv) {</p>
<p>&nbsp;&nbsp; // Thread is entering pool<br />
&nbsp;&nbsp; InterlockedIncrement(&amp;g_nThreadsCrnt);<br />
&nbsp;&nbsp; InterlockedIncrement(&amp;g_nThreadsBusy);</p>
<p>&nbsp;&nbsp; for (BOOL fStayInPool = TRUE; fStayInPool;) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Thread stops executing and waits for something to do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InterlockedDecrement(&amp;m_nThreadsBusy);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BOOL fOk = GetQueuedCompletionStatus(...);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwIOError = GetLastError();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Thread has something to do, so it's busy<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nThreadsBusy = InterlockedIncrement(&amp;m_nThreadsBusy);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Should we add another thread to the pool?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (nThreadsBusy == m_nThreadsCrnt) {&nbsp;&nbsp;&nbsp; // All threads are busy<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (nThreadsBusy &lt; m_nThreadsMax) {&nbsp;&nbsp; // The pool isn't full<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (GetCPUUsage() &lt; 75) {&nbsp;&nbsp; // CPU usage is below 75%</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Add thread to pool<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CloseHandle(chBEGINTHREADEX(...));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!fOk &amp;&amp; (dwIOError == WAIT_TIMEOUT)) {&nbsp;&nbsp; // Thread timed-out<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!ThreadHasIoPending()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // There isn't much for the server to do, and this thread<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // can die because it has no outstanding I/O requests<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fStayInPool = FALSE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (fOk || (po != NULL)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Thread woke to process something; process it<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (GetCPUUsage() &gt; 90) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // CPU usage is above 90%<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!ThreadHasIoPending()) { // No pending I/O requests<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (g_nThreadsCrnt &gt; g_nThreadsMin)) { // Pool above min</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fStayInPool = FALSE;&nbsp;&nbsp; // Remove thread from pool<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp; // Thread is leaving pool<br />
&nbsp;&nbsp; InterlockedDecrement(&amp;g_nThreadsBusy);<br />
&nbsp;&nbsp; InterlockedDecrement(&amp;g_nThreadsCurrent);<br />
&nbsp;&nbsp; return(0);<br />
}</p>
<p>注意：在这章稍早的时候（in the section &ldquo;Canceling Queued Device I/O Requests&rdquo;）。我说过：当线程退出的时候，系统自动取消所有已发起但处于挂起中的I/O请求。这就是为什么伪代码像ThreadHasIoPending这样的函数是必须的。如果线程还有未完成的I/O请求，就不要允许线程结束。<br />
许多服务都提供了管理工具，以使管理员可以通过此来控制线程池的行为。例如，设置线程数的最小值和最大值，CPU使用极限，以及最大并发线程数。</p>
<p>Simulating Completed I/O Requests<br />
I/O完成端口并不是只能用于device I/O，它也是用来解决线程间通讯问题的卓越的机制。<br />
BOOL PostQueuedCompletionStatus(<br />
&nbsp;&nbsp; HANDLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hCompPort,<br />
&nbsp;&nbsp; DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwNumBytes, <br />
&nbsp;&nbsp; ULONG_PTR&nbsp;&nbsp; CompKey, <br />
&nbsp;&nbsp; OVERLAPPED* pOverlapped);</p>
<p>这个函数将一个&ldquo;已完成的I/O&rdquo;通知添加到一个完成端口的队列上。第一个参数指定要针对的完成端口，剩下的三个参数，dwNumBtyes，ComKey和pOverlapped指出了线程调用 GetQueuedCompletionStatus时将从对应的返回参数中返回的值。当一个线程从&ldquo;I/O完成队列&rdquo;中取出一条模拟记录时，GetQueuedCompletionStatus函数将返回TRUE，表明已经成功地执行了一个I/O请求。<br />
函数PostQueuedCompletionStatus难以置信的有用，它提供了一种方式让你可以跟线程池里的所有线程通讯。例如，当用户终止服务应用程序时，你当然希望所有的线程都能够干干净净地退出。但如果有线程等待在完成端口上，并且此时又一直没有I/O请求到达，那么这些线程就不能被唤醒。通过对线程池中的每个线程调用一次PostQueuedCompletionStatus，每个线程都能得以唤醒，你就可以设计检查从GetQueuedCompletionStatus的返回参数中得到的值（比如设定完成键），可以判断出是否是程序要终止了，由此可决定是否要做清理工作并退出。<br />
当使用这项技术，你必须要特别小心。我的例子能工作是因为在池中的线程会死去并不会再次调用GetQueuedCompletionStatus。不管怎样，如果你想要通知其池中的每个线程一些事情，并且它们会循环到再次调用GetQueuedCompletionStatus，你将会有一个问题。因为线程是按LIFO的顺序醒来。所以你的应用程序中你将会使用一些额外的线程同步来确保每个线程获得了合适的机会来查看它的伪I/O记录。不使用这个格外的线程同步，一个线程可能会查看相同的通知好几次。</p>
<p><br />
</p>
</font>&nbsp;...
]]></description>
        <guid isPermaLink="true">http://neoajk.ycool.com/post.2089589.html</guid>
        <pubDate>Tue, 17 Jun 2008 03:06:43 GMT</pubDate>
<category>iocp</category>

        <category>i/o完成端口</category>
      </item>

      <item>
        <title>年轻的安徒生</title>
        <link>http://neoajk.ycool.com/post.2048774.html</link>
        <description><![CDATA[<font face="Arial">年轻的安徒生<br />
他爸爸死了<br />
妈妈进了疯人院<br />
他住在哥本哈根低矮的狗窝<br />
当他在河边哭泣时遇见国王的法律顾问<br />
于是来到乡村的一所学校开始四年的学习<br />
孩子们向他仍石块<br />
他长出了白色的翅膀<br />
只有托克看见了<br />
<br />
托克想要一个农场<br />
一些苹果树<br />
还有两头奶牛<br />
年轻的安徒生在河边给托克讲起了童话<br />
托克笑了<br />
托克从来没有笑过 但他笑了<br />
校长告诉安徒生 幻想<br />
总是伴随着愚蠢 所以<br />
不要再写诗了<br />
<br />
托克做了只巨大的风筝<br />
他将年轻的安徒生绑在风筝上<br />
飞上了天空<br />
&ldquo;我讨厌拉丁文，讨厌所有的问题还有那些烟&rdquo;<br />
<br />
托克告诉年轻的安徒生 <br />
所有的事物都是存在的<br />
你只需要发现<br />
牛顿爵士就是这样发现万有引力的<br />
校长烧掉安徒生的笔记本<br />
并在安徒生每次犯了错误后抽打托克<br />
托克说<br />
我能去哪呢<br />
有个小巨人 他喜欢骑在蝴蝶的翅膀上<br />
<br />
年轻的安徒生离开了学校<br />
他告诉托克<br />
他会给他写信的<br />
他终于走散<br />
剩下一只空酒瓶 无人再将它端起<br />
就象无弦的吉他 再也发不出声响<br />
我们常常提起安徒生<br />
因为很多年后的一天<br />
我们会跟我们的孩子讲起他的童话</font><br />...
]]></description>
        <guid isPermaLink="true">http://neoajk.ycool.com/post.2048774.html</guid>
        <pubDate>Tue, 15 Apr 2008 04:04:15 GMT</pubDate>
<category>安徒生</category>
      </item>

      <item>
        <title>4、苹果</title>
        <link>http://neoajk.ycool.com/post.2043490.html</link>
        <description><![CDATA[<p><font face="Arial">&nbsp;&nbsp;&nbsp; 阿牛送了一支吉他给我。阿牛说话的时候脸上会洋溢着阳光般的笑容，这总让我想起《<a href="http://fifid.com/search/%E5%BC%9F%E5%BC%9F?src=yb_qsal&utm_source=yb_qsal&utm_medium=link&utm_content=rsspost" target="_blank">弟弟</a>》里的弟弟。当然，阿牛比弟弟幸运。阿牛问吉他的共鸣箱为什么要做成这个形状？我把琴竖起来，让他看到琴的背面，这个形状你觉得象什么？梅梅说是女体。<br />
&nbsp;&nbsp;&nbsp; 的确如此，吉他与提琴一样拥有曼妙的身体。二十世纪三十年代&ldquo;实验摄影大师&rdquo;Man Ray拍过一张照片，那张在曲线玲珑的女背两边各以提琴琴面f洞为装饰的经典照片，令人对提琴有情欲的联想。俄罗斯名家Maxim Vengerov一九九八年购进名为克罗采的Strad时，就宣称&ldquo;我们结了婚&rdquo;。<br />
&nbsp;&nbsp;&nbsp; 不过，同样令人产生女体联想的除了琴还有苹果。<br />
&nbsp;&nbsp;&nbsp; 你见过苹果的形状吗？<br />
&nbsp;&nbsp;&nbsp; 亚当与夏娃在伊甸园的时候虽然光着身子，却并无羞耻的感觉。上帝所造的野兽当中，蛇最为狡猾。后世多把蛇看作是狸狸的化身。也就是蛇妖。歌德《<a href="http://fifid.com/search/%E6%B5%AE%E5%A3%AB%E5%BE%B7?src=yb_qsal&utm_source=yb_qsal&utm_medium=link&utm_content=rsspost" target="_blank">浮士德</a>》中，浮士德博士为求美人海伦，由侏儒载到希腊，夜遇狮身人面、美人鱼、巨蚁等神怪，接着就有蛇妖出场。在古巴比伦神话中也有狸狸的原型：面如处女而羽足似鹰、黑夜起飞猎食婴儿。<br />
&nbsp;&nbsp;&nbsp; 蛇问女人：这园子树上结的果子，你们一概吃不得吗？<br />
&nbsp;&nbsp;&nbsp; 女人回答：只有园子中央那棵树上结的苹果，上帝说了：你们不要去吃，也不许碰，否则你们一定死掉。<br />
&nbsp;&nbsp;&nbsp; 蛇说，不会吧，你们怎么会死！当然上帝不会不知，那苹果一旦被你们吃了，你们就开了眼，就会象神明一样，懂得辨善恶了。<br />
&nbsp;&nbsp;&nbsp; 女人望着那棵树上的果子，那么鲜美悦目，还能赐人智慧！就忍不住摘下一个，吃了，又给身旁的丈夫一个。两人一吃，眼就开了，发现自己光着身子。色欲坏了乐园。但此罪起于违背上帝的戒谕，根源在骄傲；所以骄傲在&ldquo;七宗罪&rdquo;之首。<br />
&nbsp;&nbsp;&nbsp; 傍晚，凉风中传来上帝走进园子的脚步声，他们忙往树丛里躲。耶和华唤道：亚当何在？<br />
&nbsp;&nbsp;&nbsp; 亚当回答：听见你走进园子，我光着身子，就躲起来了。<br />
&nbsp;&nbsp;&nbsp; 耶和华问：光着身子，谁告诉你的？莫非你吃了我不许你吃的果子？<br />
&nbsp;&nbsp;&nbsp; 亚当说：是你赐给我做伴的女人，她给我果子吃，我就吃了。这是人类第一次撒谎，推托责任。其实蛇对女人说禁果的好处时，亚当在一旁听着。<br />
&nbsp;&nbsp;&nbsp; 耶和华便问女人：为什么？<br />
&nbsp;&nbsp;&nbsp; 女人说：是蛇诱骗了我，我才吃的。<br />
&nbsp;&nbsp;&nbsp; 于是上帝对蛇说：因为你干下这桩坏事&mdash;&mdash;</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;<font size="2"> 一切家畜野兽<br />
&nbsp;&nbsp;&nbsp; 惟有有你受此诅咒：<br />
&nbsp;&nbsp;&nbsp; 从此用肚皮爬行，<br />
&nbsp;&nbsp;&nbsp; 终生以尘土为食。<br />
&nbsp;&nbsp;&nbsp; 女人与你，永世为敌，<br />
&nbsp;&nbsp;&nbsp; 子子孙孙，互相仇恨；<br />
&nbsp;&nbsp;&nbsp; 人打扁你的头，<br />
&nbsp;&nbsp;&nbsp; 你咬伤他脚跟。</font></font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 接着，对女人说：</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; <font size="2">我要倍增你怀孕的苦，<br />
&nbsp;&nbsp;&nbsp; 分娩时越发痛不可忍！<br />
&nbsp;&nbsp;&nbsp; 然而你却要依恋丈夫，<br />
&nbsp;&nbsp;&nbsp; 要丈夫做你的主人。</font></font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 最后，对亚当说：因为你听从妻子的言语，偷吃我名令禁食的果子&mdash;&mdash;</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; <font size="2">因为你，这土地要受我诅咒！<br />
&nbsp;&nbsp;&nbsp; 从此你一辈子辛劳<br />
&nbsp;&nbsp;&nbsp; 才能勉强果腹。<br />
&nbsp;&nbsp;&nbsp; 遍野荆棘杂草，<br />
&nbsp;&nbsp;&nbsp; 是你谋食的去处。<br />
&nbsp;&nbsp;&nbsp; 汗流满面，才吃得上一口，<br />
&nbsp;&nbsp;&nbsp; 直到你复归大地；<br />
&nbsp;&nbsp;&nbsp; 因为你是尘土所造，尘土<br />
&nbsp;&nbsp;&nbsp; 终是你的归宿。</font></font></p>
<p><font face="Arial"><br />
&nbsp;&nbsp;&nbsp; 阿牛走的那天来向我道别。<br />
&nbsp;&nbsp;&nbsp; 很久过后阿牛给我打电话，说起每天很忙碌，很多代码要写，很多新的程序架构要掌握，说很想念一起弹吉他的时候。</font></p>...
]]></description>
        <guid isPermaLink="true">http://neoajk.ycool.com/post.2043490.html</guid>
        <pubDate>Tue, 08 Apr 2008 04:04:22 GMT</pubDate>
<category>苹果</category>

        <category>蛇</category>
      </item>

      <item>
        <title>3、狸狸</title>
        <link>http://neoajk.ycool.com/post.2029193.html</link>
        <description><![CDATA[<p><font face="Arial" size="2">再没有王公发号施令，<br />
再没有领主高贵的身影。<br />
那里宫殿将长满荆棘，<br />
荒草和蒺藜覆盖城堡。<br />
那里豺狼安家，鸵鸟做窝，<br />
野猫邂逅鬣狗，羊鬼遥相呼应。<br />
还有狸狸，四处出没，<br />
寻找她栖身的角落。</font></p>
<p><font face="Arial" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 《<a href="http://fifid.com/search/%E4%BB%A5%E8%B5%9B%E4%BA%9A%E4%B9%A6?src=yb_qsal&utm_source=yb_qsal&utm_medium=link&utm_content=rsspost" target="_blank">以赛亚书</a>》34：11</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 狸狸与亚当吵架、跟天使争执、发誓拿婴儿报复，乃至她被世人想像为利比亚蛇妖&mdash;&mdash;&ldquo;上身形若美人，脐以下不可名状，炽烈如火&rdquo;(《<a href="http://fifid.com/search/%E5%85%89%E6%98%8E%E5%B7%A6%E6%B5%81%E8%AE%BA?src=yb_qsal&utm_source=yb_qsal&utm_medium=link&utm_content=rsspost" target="_blank">光明左流论</a>》之十九)。人开窗睡觉，她便乘风而来。<br />
&nbsp;&nbsp;&nbsp; 那么，狸狸是谁？<br />
&nbsp;&nbsp;&nbsp; 上帝用泥土照自己的模样造就了亚当。上帝说：亚当一个人孤零零的不好，我给他造个帮手做伴吧。于是取一些泥土，也按照自己的形象，捏成一个女人，从鼻孔吹入生命之气，取名狸狸。亚当看了，非常喜欢，尤其是她赤焰般飘舞的头发。<br />
&nbsp;&nbsp;&nbsp; 狸狸一直活在世上，遁入荒野，与魔鬼为伍，做了一切鬼魅的主母并撒旦的王后。<br />
&nbsp;&nbsp;&nbsp; 孩子气的撒旦，可怜的撒旦，连他女人心里念念不忘的还是以前的男人亚当，尽管是诅咒。</font></p>...
]]></description>
        <guid isPermaLink="true">http://neoajk.ycool.com/post.2029193.html</guid>
        <pubDate>Tue, 18 Mar 2008 04:03:17 GMT</pubDate>

      </item>

      <item>
        <title>听</title>
        <link>http://neoajk.ycool.com/post.2023011.html</link>
        <description><![CDATA[<p>没了</p>...
]]></description>
        <guid isPermaLink="true">http://neoajk.ycool.com/post.2023011.html</guid>
        <pubDate>Sat, 08 Mar 2008 06:03:48 GMT</pubDate>

      </item>

      <item>
        <title>后海大鲨鱼又要来了</title>
        <link>http://neoajk.ycool.com/post.2019803.html</link>
        <description><![CDATA[&lt;Man on the moon&gt;<br />
<br />
maybe this time you are here<br />
mayby this time i am there<br />
mayby next time we will be wrong<br />
we are all late<br />
maybe this time <br />
maybe next time<br />
nobody knows<br />
i wanna go down the line<br />
i wanna go down the road<br />
i wanna go down the line to find where in the world you are crying<br />
i wanna go down the line to find you <br />
<br />
maybe this time you are alone<br />
maybe this time i am alone<br />
maybe next time we all are wrong<br />
we'll be late<br />
<br />
i wanna go down the line<br />
i wanna go down the road<br />
i wanna go down the line to find where on the planet you are crying<br />
i wanna go down the line to find you <br />
<br />
i will see you again in another day<br />
i will see you again in another town <br />
i will see you again in another hotel room<br />
<br />
i wanna go down the line<br />
i wanna go down the road<br />
i wanna go down the line to find where on the moon you are crying<br />
i wanna go down the line to find you&nbsp;<br />
<br />
<br />
&lt;Hello!Passengers&gt;<br />
<br />
now i know in the town,the river is never like it used to be <br />
now i see in the street,the girl is never like she used to be there<br />
what i feel in the room,the love is never like it used to be <br />
now i here in the city ,the story is never like it used to be there<br />
<br />
where are all the passengers?<br />
in the days of the passing memories<br />
where are all the passengers<br />
in the days of what you said in the end<br />
where are all the passengers<br />
in the days of the passing memories<br />
where are all the passengers~~<br />
<br />
some days i was standing in the rain<br />
some days i was sleeping in your arms<br />
some days i see you in the night<br />
some days i see you on the road<br />
<br />
when i was wandering in the town, i saw you were walking along the river<br />
when i was floating on the sea,i saw you are sleeping in the street.<br />
when i was walking on the moon,i saw you are dreaming in the room<br />
now i kown,in my home town ,the river is never like it used to be there<br />
<br />
she is out,out of all the places<br />
she is lost<br />
she is out of all the places<br />
she lost all her passing days<br />
<br />
where are all the passengers<br />
<br />
&lt;ladysister&gt;<br />
Hey girls my lady sisters Your shoes come from the hottest island Hey boy my Mr.Brothers Your pants come from the magazine Are you such a shiboy? Are you such a shigirl? Waking up in the comic world I don&rsquo;t know your name Waking up in the comic world I can&rsquo;t see your face What does the 21th centry youths against? What does the 21th centry youths against? What does the 21th centry youths against? What does the 21th centry youths against?&nbsp;<br />
<br />
<br />
&lt;Love Is Pop&gt;<br />
love is pop<br />
love is a party<br />
we join it everyday<br />
<br />
love is a room<br />
love is a hotel<br />
we are outside every night<br />
<br />
we have a fast dream<br />
we have got a terrible life<br />
we have a horror travel in it<br />
<br />
when you leave the room<br />
the pink elephant comes<br />
when you leave the car<br />
the rozd comes to the end<br />
when you leave the bed<br />
the night becomes darkness<br />
when you leave the room <br />
the light comes to be starduse<br />
<br />
love is a hit<br />
love is a drunk<br />
we dance with it every time<br />
love is pop<br />
love is a hotel<br />
we are outside every night<br />
<br />
we have a fast dream<br />
we have got a terrible life<br />
we have a horror travel with you <br />
<br />
love is pop<br />
love is a party<br />
love is a room<br />
love is a hit<br />
<br />
给个试听的链接<br />
<font face="Arial"><a href="http://www.32yy.com/7/34c36371/all/">http://www.32yy.com/7/34c36371/all/</a><br />
<br />
<br />
<img border="0" alt="" src="http://pic.enorth.com.cn/0/03/10/08/3100801_348734.jpg" /></font>...
]]></description>
        <guid isPermaLink="true">http://neoajk.ycool.com/post.2019803.html</guid>
        <pubDate>Mon, 03 Mar 2008 08:03:48 GMT</pubDate>

      </item>
    </channel>
  </rss>
