﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-野猪世界-随笔分类-C/C++ STL Python Lua</title><link>http://www.cppblog.com/zhuyeaini/category/14135.html</link><description>server ogre cegui bullet python lua</description><language>zh-cn</language><lastBuildDate>Sat, 01 Feb 2014 10:49:45 GMT</lastBuildDate><pubDate>Sat, 01 Feb 2014 10:49:45 GMT</pubDate><ttl>60</ttl><item><title>python c++</title><link>http://www.cppblog.com/zhuyeaini/archive/2013/12/10/204699.html</link><dc:creator>野猪红</dc:creator><author>野猪红</author><pubDate>Tue, 10 Dec 2013 10:27:00 GMT</pubDate><guid>http://www.cppblog.com/zhuyeaini/archive/2013/12/10/204699.html</guid><wfw:comment>http://www.cppblog.com/zhuyeaini/comments/204699.html</wfw:comment><comments>http://www.cppblog.com/zhuyeaini/archive/2013/12/10/204699.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhuyeaini/comments/commentRss/204699.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhuyeaini/services/trackbacks/204699.html</trackback:ping><description><![CDATA[<div>#include &lt;boost/python.hpp&gt;</div><div></div><div>using namespace boost::python;</div><div></div><div>int add_five(int x) {</div><div><span style="white-space:pre">	</span>return x + 5;</div><div>}</div><div></div><div>#pragma comment(lib,"python27.lib")</div><div></div><div>BOOST_PYTHON_MODULE(Pointless)</div><div>{</div><div><span style="white-space:pre">	</span>def("add_five", add_five);</div><div>}</div><div></div><div>int main(int, char **) {</div><div></div><div><span style="white-space:pre">	</span>Py_Initialize();&nbsp;</div><div></div><div><span style="white-space:pre">	</span>try&nbsp;</div><div><span style="white-space:pre">	</span>{</div><div><span style="white-space:pre">		</span>initPointless(); // initialize Pointless</div><div></div><div><span style="white-space:pre">		</span>PyRun_SimpleString("import sys");</div><div><span style="white-space:pre">		</span>PyRun_SimpleString("sys.path.append('./')");</div><div></div><div><span style="white-space:pre">		</span>/*PyRun_SimpleString("import Pointless");</div><div><span style="white-space:pre">		</span>PyRun_SimpleString("print Pointless.add_five(4)");*/</div><div></div><div><span style="white-space:pre">		</span>PyRun_SimpleString("execfile('test.py')");</div><div><span style="white-space:pre">	</span>}</div><div><span style="white-space:pre">	</span>catch (error_already_set)&nbsp;</div><div><span style="white-space:pre">	</span>{</div><div><span style="white-space:pre">		</span>PyErr_Print();</div><div><span style="white-space:pre">	</span>}</div><div></div><div><span style="white-space:pre">	</span>Py_Finalize();</div><div><span style="white-space:pre">	</span>return 0;</div><div>}<br />//--------------------------------------------------------------------------------------<br />boost::python::manage_new_object<br />假如返回一个类型CZhu 那么使用时必须在python中注册CZhu对应的类<br />//--------------------------------------------------------------------------------------<br />boost::python::<span style="font-size: 14px;">return_opaque_pointer<br />这个就仅仅是个python包装的指针 用来传回给c++做点什么的<br /></span></div><img src ="http://www.cppblog.com/zhuyeaini/aggbug/204699.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhuyeaini/" target="_blank">野猪红</a> 2013-12-10 18:27 <a href="http://www.cppblog.com/zhuyeaini/archive/2013/12/10/204699.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模型</title><link>http://www.cppblog.com/zhuyeaini/archive/2013/05/31/200729.html</link><dc:creator>野猪红</dc:creator><author>野猪红</author><pubDate>Fri, 31 May 2013 12:37:00 GMT</pubDate><guid>http://www.cppblog.com/zhuyeaini/archive/2013/05/31/200729.html</guid><wfw:comment>http://www.cppblog.com/zhuyeaini/comments/200729.html</wfw:comment><comments>http://www.cppblog.com/zhuyeaini/archive/2013/05/31/200729.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhuyeaini/comments/commentRss/200729.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhuyeaini/services/trackbacks/200729.html</trackback:ping><description><![CDATA[代码原则：<br />1 一个对象只管理属于她自己的东西，其他对象用UUID来索引<br />2 要将特殊化转为一般化，易于管理<br />3 参数要一般化，最小化，重用原则<br />4 对象要分层，每层用type区分，每层只有自己的数据<br /><br />ogre渲染对象原则<br />1 考虑是在哪个RenderQueueGroup上<br />2 考虑和其对应实体联系，UUID的位置<br />3 透明 雾化<br />4 对反射，折射的影响<br />5 如何序列化<img src ="http://www.cppblog.com/zhuyeaini/aggbug/200729.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhuyeaini/" target="_blank">野猪红</a> 2013-05-31 20:37 <a href="http://www.cppblog.com/zhuyeaini/archive/2013/05/31/200729.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通用的多线程处理模型</title><link>http://www.cppblog.com/zhuyeaini/archive/2013/01/24/197545.html</link><dc:creator>野猪红</dc:creator><author>野猪红</author><pubDate>Thu, 24 Jan 2013 12:07:00 GMT</pubDate><guid>http://www.cppblog.com/zhuyeaini/archive/2013/01/24/197545.html</guid><wfw:comment>http://www.cppblog.com/zhuyeaini/comments/197545.html</wfw:comment><comments>http://www.cppblog.com/zhuyeaini/archive/2013/01/24/197545.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhuyeaini/comments/commentRss/197545.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhuyeaini/services/trackbacks/197545.html</trackback:ping><description><![CDATA[好 草 多线程处理<br />放代码： 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ThreadTest<br /><img id="Codehighlighter1_17_561_Open_Image" onclick="this.style.display='none'; Codehighlighter1_17_561_Open_Text.style.display='none'; Codehighlighter1_17_561_Closed_Image.style.display='inline'; Codehighlighter1_17_561_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_17_561_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_17_561_Closed_Text.style.display='none'; Codehighlighter1_17_561_Open_Image.style.display='inline'; Codehighlighter1_17_561_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_17_561_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_17_561_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /><img id="Codehighlighter1_40_41_Open_Image" onclick="this.style.display='none'; Codehighlighter1_40_41_Open_Text.style.display='none'; Codehighlighter1_40_41_Closed_Image.style.display='inline'; Codehighlighter1_40_41_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_40_41_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_40_41_Closed_Text.style.display='none'; Codehighlighter1_40_41_Open_Image.style.display='inline'; Codehighlighter1_40_41_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;ThreadTest()</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_40_41_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_40_41_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000"><br /><img id="Codehighlighter1_57_58_Open_Image" onclick="this.style.display='none'; Codehighlighter1_57_58_Open_Text.style.display='none'; Codehighlighter1_57_58_Closed_Image.style.display='inline'; Codehighlighter1_57_58_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_57_58_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_57_58_Closed_Text.style.display='none'; Codehighlighter1_57_58_Open_Image.style.display='inline'; Codehighlighter1_57_58_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">ThreadTest()</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_57_58_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_57_58_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;startup();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;addreq(</span><span style="color: #0000ff">int</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;_threadMain();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;_waitForNextRequest();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;_processNextRequest();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;WorkerFunc&nbsp;OGRE_THREAD_WORKER_INHERIT<br /><img id="Codehighlighter1_224_334_Open_Image" onclick="this.style.display='none'; Codehighlighter1_224_334_Open_Text.style.display='none'; Codehighlighter1_224_334_Closed_Image.style.display='inline'; Codehighlighter1_224_334_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_224_334_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_224_334_Closed_Text.style.display='none'; Codehighlighter1_224_334_Open_Image.style.display='inline'; Codehighlighter1_224_334_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_224_334_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_224_334_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ThreadTest</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;mQueue;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WorkerFunc(ThreadTest</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;q)&nbsp;<br /><img id="Codehighlighter1_293_294_Open_Image" onclick="this.style.display='none'; Codehighlighter1_293_294_Open_Text.style.display='none'; Codehighlighter1_293_294_Closed_Image.style.display='inline'; Codehighlighter1_293_294_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_293_294_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_293_294_Closed_Text.style.display='none'; Codehighlighter1_293_294_Open_Image.style.display='inline'; Codehighlighter1_293_294_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;mQueue(q)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_293_294_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_293_294_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">operator</span><span style="color: #000000">()();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;run();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;WorkerFunc</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;mWorkerFunc;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;std::deque</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;RequestQueue;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;RequestQueue&nbsp;mRequestQueue;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;OGRE_MUTEX(mRequestMutex)<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;OGRE_MUTEX(mProcessMutex)<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;OGRE_MUTEX(mResponseMutex)<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;OGRE_THREAD_SYNCHRONISER(mRequestCondition)<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" />}</span></span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ThreadTest::addreq(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i)<br /><img id="Codehighlighter1_596_702_Open_Image" onclick="this.style.display='none'; Codehighlighter1_596_702_Open_Text.style.display='none'; Codehighlighter1_596_702_Closed_Image.style.display='inline'; Codehighlighter1_596_702_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_596_702_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_596_702_Closed_Text.style.display='none'; Codehighlighter1_596_702_Open_Image.style.display='inline'; Codehighlighter1_596_702_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_596_702_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_596_702_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;OGRE_LOCK_MUTEX(mRequestMutex)<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;mRequestQueue.push_back(i);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;OGRE_THREAD_NOTIFY_ONE(mRequestCondition)<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ThreadTest::startup()<br /><img id="Codehighlighter1_731_875_Open_Image" onclick="this.style.display='none'; Codehighlighter1_731_875_Open_Text.style.display='none'; Codehighlighter1_731_875_Closed_Image.style.display='inline'; Codehighlighter1_731_875_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_731_875_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_731_875_Closed_Text.style.display='none'; Codehighlighter1_731_875_Open_Image.style.display='inline'; Codehighlighter1_731_875_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_731_875_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_731_875_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">3</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(i</span><span style="color: #000000">&gt;</span><span style="color: #000000">0</span><span style="color: #000000">)<br /><img id="Codehighlighter1_756_872_Open_Image" onclick="this.style.display='none'; Codehighlighter1_756_872_Open_Text.style.display='none'; Codehighlighter1_756_872_Closed_Image.style.display='inline'; Codehighlighter1_756_872_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_756_872_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_756_872_Closed_Text.style.display='none'; Codehighlighter1_756_872_Open_Image.style.display='inline'; Codehighlighter1_756_872_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_756_872_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_756_872_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mWorkerFunc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;OGRE_NEW_T(WorkerFunc(</span><span style="color: #0000ff">this</span><span style="color: #000000">),&nbsp;MEMCATEGORY_GENERAL);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OGRE_THREAD_CREATE(t,&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">mWorkerFunc);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="color: #000000">--</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ThreadTest::WorkerFunc::</span><span style="color: #0000ff">operator</span><span style="color: #000000">()()<br /><img id="Codehighlighter1_919_945_Open_Image" onclick="this.style.display='none'; Codehighlighter1_919_945_Open_Text.style.display='none'; Codehighlighter1_919_945_Closed_Image.style.display='inline'; Codehighlighter1_919_945_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_919_945_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_919_945_Closed_Text.style.display='none'; Codehighlighter1_919_945_Open_Image.style.display='inline'; Codehighlighter1_919_945_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_919_945_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_919_945_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;mQueue</span><span style="color: #000000">-&gt;</span><span style="color: #000000">_threadMain();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ThreadTest::WorkerFunc::run()<br /><img id="Codehighlighter1_983_1009_Open_Image" onclick="this.style.display='none'; Codehighlighter1_983_1009_Open_Text.style.display='none'; Codehighlighter1_983_1009_Closed_Image.style.display='inline'; Codehighlighter1_983_1009_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_983_1009_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_983_1009_Closed_Text.style.display='none'; Codehighlighter1_983_1009_Open_Image.style.display='inline'; Codehighlighter1_983_1009_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_983_1009_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_983_1009_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;mQueue</span><span style="color: #000000">-&gt;</span><span style="color: #000000">_threadMain();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ThreadTest::_threadMain()<br /><img id="Codehighlighter1_1042_1115_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1042_1115_Open_Text.style.display='none'; Codehighlighter1_1042_1115_Closed_Image.style.display='inline'; Codehighlighter1_1042_1115_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_1042_1115_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1042_1115_Closed_Text.style.display='none'; Codehighlighter1_1042_1115_Open_Image.style.display='inline'; Codehighlighter1_1042_1115_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1042_1115_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_1042_1115_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">true</span><span style="color: #000000">)<br /><img id="Codehighlighter1_1059_1112_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1059_1112_Open_Text.style.display='none'; Codehighlighter1_1059_1112_Closed_Image.style.display='inline'; Codehighlighter1_1059_1112_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_1059_1112_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1059_1112_Closed_Text.style.display='none'; Codehighlighter1_1059_1112_Open_Image.style.display='inline'; Codehighlighter1_1059_1112_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1059_1112_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_1059_1112_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_waitForNextRequest();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_processNextRequest();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ThreadTest::_waitForNextRequest()<br /><img id="Codehighlighter1_1157_1309_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1157_1309_Open_Text.style.display='none'; Codehighlighter1_1157_1309_Closed_Image.style.display='inline'; Codehighlighter1_1157_1309_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_1157_1309_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1157_1309_Closed_Text.style.display='none'; Codehighlighter1_1157_1309_Open_Image.style.display='inline'; Codehighlighter1_1157_1309_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1157_1309_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_1157_1309_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;OGRE_LOCK_MUTEX_NAMED(mRequestMutex,&nbsp;queueLock);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(mRequestQueue.empty())<br /><img id="Codehighlighter1_1238_1306_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1238_1306_Open_Text.style.display='none'; Codehighlighter1_1238_1306_Closed_Image.style.display='inline'; Codehighlighter1_1238_1306_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_1238_1306_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1238_1306_Closed_Text.style.display='none'; Codehighlighter1_1238_1306_Open_Image.style.display='inline'; Codehighlighter1_1238_1306_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1238_1306_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_1238_1306_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OGRE_THREAD_WAIT(mRequestCondition,&nbsp;mRequestMutex,&nbsp;queueLock);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ThreadTest::_processNextRequest()<br /><img id="Codehighlighter1_1351_1558_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1351_1558_Open_Text.style.display='none'; Codehighlighter1_1351_1558_Closed_Image.style.display='inline'; Codehighlighter1_1351_1558_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_1351_1558_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1351_1558_Closed_Text.style.display='none'; Codehighlighter1_1351_1558_Open_Image.style.display='inline'; Codehighlighter1_1351_1558_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1351_1558_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_1351_1558_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;OGRE_LOCK_MUTEX(mProcessMutex)<br /><img id="Codehighlighter1_1386_1555_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1386_1555_Open_Text.style.display='none'; Codehighlighter1_1386_1555_Closed_Image.style.display='inline'; Codehighlighter1_1386_1555_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_1386_1555_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1386_1555_Closed_Text.style.display='none'; Codehighlighter1_1386_1555_Open_Image.style.display='inline'; Codehighlighter1_1386_1555_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1386_1555_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_1386_1555_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OGRE_LOCK_MUTEX(mRequestMutex);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">mRequestQueue.empty())<br /><img id="Codehighlighter1_1454_1552_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1454_1552_Open_Text.style.display='none'; Codehighlighter1_1454_1552_Closed_Image.style.display='inline'; Codehighlighter1_1454_1552_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_1454_1552_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1454_1552_Closed_Text.style.display='none'; Codehighlighter1_1454_1552_Open_Image.style.display='inline'; Codehighlighter1_1454_1552_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1454_1552_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_1454_1552_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;request&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mRequestQueue.front();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mRequestQueue.pop_front();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">request</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /></span></div>当然 里面用到了一些ogre中的线程宏，展开也就是boost的线程api：<br />#define OGRE_LOCK_MUTEX(name) boost::recursive_mutex::scoped_lock ogrenameLock(name);<br />#define OGRE_LOCK_MUTEX_NAMED(mutexName, lockName) boost::recursive_mutex::scoped_lock lockName(mutexName);<br /><br />#define OGRE_THREAD_WAIT(sync, mutex, lock) sync.wait(lock);<br />#define OGRE_THREAD_NOTIFY_ONE(sync) sync.notify_one(); <br />#define OGRE_THREAD_NOTIFY_ALL(sync) sync.notify_all(); <br /><br />#define OGRE_THREAD_SYNCHRONISER(sync) boost::condition sync;<br /><br />#define OGRE_MUTEX(name) mutable boost::recursive_mutex name;<br /><br />#define OGRE_THREAD_WAIT(sync, mutex, lock) sync.wait(lock);<br /><br />主线程不断调用addreq()来增加请求并通知线程后马上返回 线程在得到通知后从阻塞中醒来处理请求<br />OGRE_LOCK_MUTEX(name)：就是在范围内只允许有一个线程进入<br /><span style="color: red;">OGRE_THREAD_WAIT(mRequestCondition, mRequestMutex, queueLock)：该宏会失去queueLock，阻塞当前线程直到被通知，在返回前取得queueLock</span><br />来看_waitForNextRequest()的代码：<br />_waitForNextRequest()<br />{<br />&nbsp;&nbsp;&nbsp;OGRE_LOCK_MUTEX_NAMED(mRequestMutex, queueLock);<br />&nbsp;&nbsp;&nbsp;&nbsp;if (mRequestQueue.empty())<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OGRE_THREAD_WAIT(mRequestCondition, mRequestMutex, queueLock);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />首先取得范围锁queueLock，如果mRequestQueue为空，就等着，同时要注意，由于失去queueLock，其他线程会得到queueLock，并再次导致queueLock的变化<br /><span style="color: red;">如果有三个线程，分别是1,2,3</span><br /><span style="color: red;">假设线程1最先取得queueLock，然后被阻塞，同时线程2或者3会在线程1失去queueLock时取得queueLock，最终，三个线程都会被阻塞</span>，queueLock为失去<br />继续往下走，假设这时主线程addreq()，那么有一个线程会被唤醒，同时得到queueLock，然后跳出该函数时，queueLock也随着超出范围变为失去，然后来看<br />下一个函数_processNextRequest()的代码：<br />_processNextRequest()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Request* request = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OGRE_LOCK_MUTEX(mRequestMutex) 
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!mRequestQueue.empty())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request = mRequestQueue.front();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mRequestQueue.pop_front();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (request)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processRequestResponse(request, false);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>}<br />函数内容改了下以看得更加清楚，函数取得mRequestMutex，当其队列非空时，从队列中弹出一个请求，随后丢失mRequestMutex，并处理request<br />在处理完request后，将结果放进一个响应队列中，主线程在其循环中将会看到，整个流程就是这样子<br />总结：请求队列要注意是否为空，由于有多个线程，需要将其设为阻塞并在需要时唤醒<br /><br /><img src ="http://www.cppblog.com/zhuyeaini/aggbug/197545.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhuyeaini/" target="_blank">野猪红</a> 2013-01-24 20:07 <a href="http://www.cppblog.com/zhuyeaini/archive/2013/01/24/197545.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lua 中调用C函数</title><link>http://www.cppblog.com/zhuyeaini/archive/2011/04/27/145149.html</link><dc:creator>野猪红</dc:creator><author>野猪红</author><pubDate>Wed, 27 Apr 2011 07:48:00 GMT</pubDate><guid>http://www.cppblog.com/zhuyeaini/archive/2011/04/27/145149.html</guid><wfw:comment>http://www.cppblog.com/zhuyeaini/comments/145149.html</wfw:comment><comments>http://www.cppblog.com/zhuyeaini/archive/2011/04/27/145149.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhuyeaini/comments/commentRss/145149.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhuyeaini/services/trackbacks/145149.html</trackback:ping><description><![CDATA[<p>好的 现在讲讲Lua中调用C函数<br>怎么调用？<img height=20 src="http://www.cppblog.com/Emoticons/QQ/icon18.gif" width=25 border=0><br>extern "C"<br>{<br>#include &lt;lua.h&gt;<br>#include &lt;lauxlib.h&gt;</p>
<p>#pragma&nbsp; comment(lib,"lua51.lib")</p>
<p>&nbsp;static int l_test(lua_State* l)<br>&nbsp;{<br>&nbsp;&nbsp;double d=lua_tonumber(l,1);<br>&nbsp;&nbsp;lua_pushnumber(l,d*d);<br>&nbsp;&nbsp;return 1;<br>&nbsp;}</p>
<p>&nbsp;__declspec(dllexport) int luaopen_test(lua_State* l)<br>&nbsp;{<br>&nbsp;&nbsp;static const luaL_reg maps[]={<br>&nbsp;&nbsp;&nbsp;{"test",l_test},<br>&nbsp;&nbsp;&nbsp;{NULL,NULL}<br>&nbsp;&nbsp;};<br>&nbsp;&nbsp;luaL_register(l,"mytest",maps);<br>&nbsp;&nbsp;return 1;<br>&nbsp;}<br>}<br>参数在lua中给出，而在c函数中，通过取栈操作得到参数，c经过处理，把结果压入栈中，ok<br><br>要点有二：<br>1. __declspec(dllexport) 要有<br>2. luaopen_模块名，假设生成的dll叫test.dll，那么函数名就叫luaopen_test<br><br>好 就是这样 谢谢</p>
<img src ="http://www.cppblog.com/zhuyeaini/aggbug/145149.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhuyeaini/" target="_blank">野猪红</a> 2011-04-27 15:48 <a href="http://www.cppblog.com/zhuyeaini/archive/2011/04/27/145149.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模板类的构造函数 =操作符重载</title><link>http://www.cppblog.com/zhuyeaini/archive/2010/08/09/122793.html</link><dc:creator>野猪红</dc:creator><author>野猪红</author><pubDate>Mon, 09 Aug 2010 08:23:00 GMT</pubDate><guid>http://www.cppblog.com/zhuyeaini/archive/2010/08/09/122793.html</guid><wfw:comment>http://www.cppblog.com/zhuyeaini/comments/122793.html</wfw:comment><comments>http://www.cppblog.com/zhuyeaini/archive/2010/08/09/122793.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhuyeaini/comments/commentRss/122793.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhuyeaini/services/trackbacks/122793.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">template</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ye<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;ye(){cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">I'm&nbsp;ye()</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;}<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">-------------------------------</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //普通拷贝构造函数<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;ye(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;ye</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;&amp;</span><span style="color: #000000;">y){cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">I'm&nbsp;ye(const&nbsp;ye&lt;T&gt;&amp;)</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #579817;">//模板拷贝构造函数</span><br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;template</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;K</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;ye(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;ye</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">K</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">){cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">I'm&nbsp;template&lt;class&nbsp;K&gt;ye(const&nbsp;ye&lt;K&gt;&amp;)</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;}<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">-------------------------------<br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #008000;"><br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">-------------------------------</span><span style="color: #008000;"><br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;ye(T</span><span style="color: #000000;">*</span><span style="color: #000000;">)<br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">I'm&nbsp;ye(T*)</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;template</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Y</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;ye(Y</span><span style="color: #000000;">*</span><span style="color: #000000;">){cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">I'm&nbsp;template&lt;class&nbsp;Y&gt;&nbsp;ye(Y*)</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;}<br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">-------------------------------<br></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #008000;"><br></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">-------------------------------</span><span style="color: #008000;"><br></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;"></span><span style="color: #008000;">ye&amp;&nbsp;operator=(const&nbsp;ye&lt;T&gt;&nbsp;&amp;)<br></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">25</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"I'm&nbsp;operator=(const&nbsp;ye&lt;T&gt;&amp;)"&lt;&lt;endl;<br></span><span style="color: #008080;">26</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;*this;<br></span><span style="color: #008080;">27</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #008000;"></span><span style="color: #000000;"><br></span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;"></span><span style="color: #008000;">template&lt;class&nbsp;N&gt;<br></span><span style="color: #008080;">29</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;ye&amp;&nbsp;operator=(const&nbsp;ye&lt;N&gt;&nbsp;&amp;)<br></span><span style="color: #008080;">30</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">31</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"I'm&nbsp;template&lt;class&nbsp;N&gt;&nbsp;operator=(const&nbsp;ye&lt;N&gt;&amp;)"&lt;&lt;endl;<br></span><span style="color: #008080;">32</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;*this;<br></span><span style="color: #008080;">33</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #008000;"></span><span style="color: #000000;"><br></span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">-------------------------------</span><span style="color: #008000;"><br></span><span style="color: #008080;">35</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;"><br></span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;">};</span></div>
<br>上面是一个典型的模板类 首先看构造函数<br>当我们输入<br>ye&lt;int&gt; y;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #579817;">//输出</span><span style="color: #000000;"><span style="color: #579817;">I'm&nbsp;ye()</span><br>ye&lt;int&gt; k=y;或ye&lt;int&gt; k(y);<span style="color: #579817;">//输出</span></span><span style="color: #579817;"></span><span style="color: #000000;"><span style="color: #579817;">I'm&nbsp;ye(const&nbsp;ye&lt;T&gt;&amp;)</span><br>ye&lt;float&gt; f=k;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #579817;">//输出</span></span><span style="color: #579817;">I'm&nbsp;template&lt;class&nbsp;K&gt;ye(const&nbsp;ye&lt;K&gt;&amp;)</span><span style="color: #000000;"><br>到此 没什么问题<br><br>现在注释掉两个拷贝构造函数<br>输入<br>ye&lt;int&gt; y;&nbsp;&nbsp; <span style="color: #579817;">//输出</span></span><span style="color: #579817;">I'm&nbsp;ye()</span><br><span style="color: #000000;">ye&lt;int&gt; k=y; <span style="color: #579817;">//无输出，使用默认的构造函数<br></span></span><br>清空 输入<br>ye&lt;int&gt; y;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000000;"><span style="color: #579817;"></span></span><span style="color: #579817;"></span><br>ye&lt;float&gt; k=y; <span style="color: #9c3f3f;">//会出现编译错误</span><br><br>清空 输入<br>ye&lt;int&gt; y;<br>ye&lt;int&gt; k;<br>y=k;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #5a8c53;">//</span><span style="color: #008000;">I'm&nbsp;operator=(const&nbsp;ye&lt;T&gt;&amp;)</span><br>ye&lt;float&gt; h;<br>h=k;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #5a8c53;">//</span><span style="color: #008000;">I'm&nbsp;template&lt;class&nbsp;N&gt;&nbsp;operator=(const&nbsp;ye&lt;N&gt;&amp;)</span><br><br>如果把操作符重载函数注释掉<br>当出现y=k时 就会调用相应默认的赋值函数<br>当出现h=k时 就会出现编译错误<br><br><br> <img src ="http://www.cppblog.com/zhuyeaini/aggbug/122793.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhuyeaini/" target="_blank">野猪红</a> 2010-08-09 16:23 <a href="http://www.cppblog.com/zhuyeaini/archive/2010/08/09/122793.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>stl 排序</title><link>http://www.cppblog.com/zhuyeaini/archive/2010/06/27/118825.html</link><dc:creator>野猪红</dc:creator><author>野猪红</author><pubDate>Sun, 27 Jun 2010 08:35:00 GMT</pubDate><guid>http://www.cppblog.com/zhuyeaini/archive/2010/06/27/118825.html</guid><wfw:comment>http://www.cppblog.com/zhuyeaini/comments/118825.html</wfw:comment><comments>http://www.cppblog.com/zhuyeaini/archive/2010/06/27/118825.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhuyeaini/comments/commentRss/118825.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhuyeaini/services/trackbacks/118825.html</trackback:ping><description><![CDATA[<img src="http://www.cppblog.com/CuteSoft_Client/CuteEditor/images/emvamp.gif" align="absmiddle" border="0"> 好 我喜欢这个小蝙蝠<br>vector list map 这些结构的使用率比较高 看看如何定制其排序<br>1 vector<br>vector是无序结构 可以使用标准算法std::sort方法来排序 查看sort的源码可以了解到<br>sort算法总体是采用快速排序 局部采用插入排序 效率良好 通过指定sort的第3个参数 <br>一个函数对象的实例 我们可以定制排序行为 让其从大到小或从小到大 我们看例子：<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;SortMethod<br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">()(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;b) const<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;a</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">b;<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008080;"><br>12</span><span style="color: #000000;"><br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;vector</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;v;<br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;v.push_back(</span><span style="color: #000000;">5</span><span style="color: #000000;">);<br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;v.push_back(</span><span style="color: #000000;">8</span><span style="color: #000000;">);<br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;v.push_back(</span><span style="color: #000000;">2</span><span style="color: #000000;">);<br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;std::sort(v.begin(),v.end(),SortMethod());<br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">}</span></div>
如果要让其按反序排列 修改重载函数为 return a&gt;b 如果没有提供第3个参数<br>默认是std::less&lt;&gt;() 该类是重载了()操作符的模板类 效果和SortMethod类似<br>现在我们的数据类型是int 如果是class或者struct且接受默认比较函数对象<br>就得在类中实现重载&lt;操作符 看例子：<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;yezhu<br>{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;yezhu():i(</span><span style="color: #000000;">0</span><span style="color: #000000;">){cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">I'm&nbsp;yezhu&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">i</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">yezhu(){cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">del&nbsp;yezhu&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">i</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;}<br>&nbsp;&nbsp;&nbsp;&nbsp;yezhu(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n):i(n){cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">I'm&nbsp;yezhu&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">i</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setValue(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n){i</span><span style="color: #000000;">=</span><span style="color: #000000;">n;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;getValue()&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">{</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;i;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;yezhu</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;val)&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">val.i;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #0000ff;">protected</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i;<br>};<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;vector</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">yezhu</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;v;<br>&nbsp;&nbsp;&nbsp;&nbsp;v.push_back(yezhu(</span><span style="color: #000000;">3</span><span style="color: #000000;">));<br>&nbsp;&nbsp;&nbsp;&nbsp;v.push_back(yezhu(</span><span style="color: #000000;">2</span><span style="color: #000000;">));<br>&nbsp;&nbsp;&nbsp;&nbsp;v.push_back(yezhu(</span><span style="color: #000000;">1</span><span style="color: #000000;">));<br>&nbsp;&nbsp;&nbsp;&nbsp;std::sort(v.begin(),v.end());<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div>
<br>2.list<br>list有自己的sort函数 有一个可选参数 默认是std::less&lt;&gt;() 不能用标准sort()函数排序<br><br>3.map<br>map是有序结构 在其构造的时候可以指定比较函数对象 注意 这里提供的不是实例 而是类型<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;map</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">,</span><span style="color: #0000ff;">char</span><span style="color: #000000;">,greater</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;m;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}&nbsp;&nbsp;&nbsp;&nbsp;</span></div>
<br><br><img src ="http://www.cppblog.com/zhuyeaini/aggbug/118825.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhuyeaini/" target="_blank">野猪红</a> 2010-06-27 16:35 <a href="http://www.cppblog.com/zhuyeaini/archive/2010/06/27/118825.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>