﻿<?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++博客-0OO-随笔分类-C/C++</title><link>http://www.cppblog.com/0OO/category/11733.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 21 Jul 2013 00:25:13 GMT</lastBuildDate><pubDate>Sun, 21 Jul 2013 00:25:13 GMT</pubDate><ttl>60</ttl><item><title>一个特殊的缓存队列</title><link>http://www.cppblog.com/0OO/archive/2013/07/10/201655.html</link><dc:creator>零圈圈</dc:creator><author>零圈圈</author><pubDate>Wed, 10 Jul 2013 02:20:00 GMT</pubDate><guid>http://www.cppblog.com/0OO/archive/2013/07/10/201655.html</guid><wfw:comment>http://www.cppblog.com/0OO/comments/201655.html</wfw:comment><comments>http://www.cppblog.com/0OO/archive/2013/07/10/201655.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/0OO/comments/commentRss/201655.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/0OO/services/trackbacks/201655.html</trackback:ping><description><![CDATA[实现这么一个缓存:<br />(1)缓存的对象是固定大小<br />(2)只能从该缓存中分配内存<br />(3)释放内存要回到缓存中<br />(4)读写缓存中的数据符合FIFO规则<br />用途:<br />(1)接受固定大小的数据块,然后写入缓存中,工作线程从缓存中读取数据块进行处理.<br /><br />代码:<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">/*</span><span style="color: #008000; ">*<br />&nbsp;*&nbsp;FIFO_Pool.h<br />&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />#ifndef&nbsp;__FIFO_POOL_H<br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;__FIFO_POOL_H</span><span style="color: #000000; "><br /><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">boost</span><span style="color: #000000; ">/</span><span style="color: #000000; ">noncopyable.hpp</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">boost</span><span style="color: #000000; ">/</span><span style="color: #000000; ">pool</span><span style="color: #000000; ">/</span><span style="color: #000000; ">object_pool.hpp</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">boost</span><span style="color: #000000; ">/</span><span style="color: #000000; ">thread.hpp</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">boost</span><span style="color: #000000; ">/</span><span style="color: #000000; ">assert.hpp</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">queue</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;ikud&nbsp;{<br /><br />template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;FIFO_Pool&nbsp;:&nbsp;boost::noncopyable<br />{<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;FIFO_Pool(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;size);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">virtual</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">~</span><span style="color: #000000; ">FIFO_Pool(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">)&nbsp;{&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">no-op</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;T</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;malloc(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;free(T</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;ptr);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;read(T</span><span style="color: #000000; ">**</span><span style="color: #000000; ">&nbsp;ptr);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;write(T</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;ptr);<br /><br /></span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;capacity_;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total_;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;boost::object_pool</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;pool_;<br />&nbsp;&nbsp;&nbsp;&nbsp;boost::mutex&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool_mutex_;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;std::queue</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T</span><span style="color: #000000; ">*&gt;</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fifo_;<br />&nbsp;&nbsp;&nbsp;&nbsp;boost::mutex&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fifo_mutex_;<br />&nbsp;&nbsp;&nbsp;&nbsp;boost::condition&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fifo_cond_;<br /><br />};<br /><br />template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />FIFO_Pool</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::FIFO_Pool(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;size)&nbsp;:&nbsp;capacity_(size),&nbsp;total_(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOST_ASSERT(size&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />}<br /><br />template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />T</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;FIFO_Pool</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::malloc()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;boost::mutex::scoped_lock&nbsp;</span><span style="color: #0000FF; ">lock</span><span style="color: #000000; ">(pool_mutex_);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;T</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;ptr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(total_&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;capacity_)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;pool_.malloc();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(ptr&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">&nbsp;total_;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;ptr;<br />}<br /><br />template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;FIFO_Pool</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::free(T</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;ptr)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOST_ASSERT(pool_.is_from(ptr));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;boost::mutex::scoped_lock&nbsp;</span><span style="color: #0000FF; ">lock</span><span style="color: #000000; ">(pool_mutex_);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;pool_.free(ptr);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">--</span><span style="color: #000000; ">&nbsp;total_;<br />}<br /><br />template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;FIFO_Pool</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::read(T</span><span style="color: #000000; ">**</span><span style="color: #000000; ">&nbsp;ptr)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;boost::mutex::scoped_lock&nbsp;</span><span style="color: #0000FF; ">lock</span><span style="color: #000000; ">(fifo_mutex_);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(fifo_.size()&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fifo_cond_.wait(</span><span style="color: #0000FF; ">lock</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">ptr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;fifo_.front();<br />&nbsp;&nbsp;&nbsp;&nbsp;fifo_.pop();<br /><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 />}<br /><br />template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;FIFO_Pool</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::write(T</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;ptr)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOST_ASSERT(pool_.is_from(ptr));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;boost::mutex::scoped_lock&nbsp;</span><span style="color: #0000FF; ">lock</span><span style="color: #000000; ">(fifo_mutex_);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;fifo_.push(ptr);<br />&nbsp;&nbsp;&nbsp;&nbsp;fifo_cond_.notify_one();<br /><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 />}<br /><br /><br />}&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;namespace&nbsp;ikud</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#endif</span><span style="color: #000000; ">&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;__FIFO_POOL_H</span><span style="color: #000000; "><br /></span></div><img src ="http://www.cppblog.com/0OO/aggbug/201655.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/0OO/" target="_blank">零圈圈</a> 2013-07-10 10:20 <a href="http://www.cppblog.com/0OO/archive/2013/07/10/201655.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>闭包-初级概念</title><link>http://www.cppblog.com/0OO/archive/2013/07/04/201515.html</link><dc:creator>零圈圈</dc:creator><author>零圈圈</author><pubDate>Thu, 04 Jul 2013 06:28:00 GMT</pubDate><guid>http://www.cppblog.com/0OO/archive/2013/07/04/201515.html</guid><wfw:comment>http://www.cppblog.com/0OO/comments/201515.html</wfw:comment><comments>http://www.cppblog.com/0OO/archive/2013/07/04/201515.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/0OO/comments/commentRss/201515.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/0OO/services/trackbacks/201515.html</trackback:ping><description><![CDATA[<div>通俗的说：子函数可以使用父函数中的局部变量，这种行为就叫做闭包！</div><div><div>function a(){</div> <div>var i=0;</div> <div>function b(){</div> <div>alert(++i);</div> <div>}</div> <div>return b;</div> <div>}</div> <div>var c = a();</div> <div>c();</div></div><img src ="http://www.cppblog.com/0OO/aggbug/201515.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/0OO/" target="_blank">零圈圈</a> 2013-07-04 14:28 <a href="http://www.cppblog.com/0OO/archive/2013/07/04/201515.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost singleton</title><link>http://www.cppblog.com/0OO/archive/2013/06/28/201361.html</link><dc:creator>零圈圈</dc:creator><author>零圈圈</author><pubDate>Fri, 28 Jun 2013 03:16:00 GMT</pubDate><guid>http://www.cppblog.com/0OO/archive/2013/06/28/201361.html</guid><wfw:comment>http://www.cppblog.com/0OO/comments/201361.html</wfw:comment><comments>http://www.cppblog.com/0OO/archive/2013/06/28/201361.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/0OO/comments/commentRss/201361.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/0OO/services/trackbacks/201361.html</trackback:ping><description><![CDATA[这段时间打算从ACE库转移到boost库上,遇到很多问题.<br />boost的singleton没有单独的库实现,在1.33.1版本发现了两处:<br /><div>/usr/include/boost/thread/detail/singleton.hpp</div><div>/usr/include/boost/pool/detail/singleton.hpp</div><br />thread库里面的实现非常简单,采用函数里面static变量仅被初始化一次的特性,整个实现就两句话:<br /><div><div>&nbsp;&nbsp;&nbsp; static singleton&lt;T&gt; s_oT;<br />&nbsp;&nbsp;&nbsp; return(s_oT);<br />这个就是网上说的2B青年的做法,缺陷啥的不多说了.<br /><br />pool库的实现就比较复杂,思想是在main函数调用前,就先实例化,并解决多线程的问题,缺陷就是不能lazy了.</div></div><img src ="http://www.cppblog.com/0OO/aggbug/201361.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/0OO/" target="_blank">零圈圈</a> 2013-06-28 11:16 <a href="http://www.cppblog.com/0OO/archive/2013/06/28/201361.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C/C++ 在线参考手册</title><link>http://www.cppblog.com/0OO/archive/2009/09/11/95892.html</link><dc:creator>零圈圈</dc:creator><author>零圈圈</author><pubDate>Fri, 11 Sep 2009 02:58:00 GMT</pubDate><guid>http://www.cppblog.com/0OO/archive/2009/09/11/95892.html</guid><wfw:comment>http://www.cppblog.com/0OO/comments/95892.html</wfw:comment><comments>http://www.cppblog.com/0OO/archive/2009/09/11/95892.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/0OO/comments/commentRss/95892.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/0OO/services/trackbacks/95892.html</trackback:ping><description><![CDATA[<a style="font-family: 幼圆; font-size: 14pt;" href="http://www.cppreference.com/wiki/">&nbsp;&nbsp;&nbsp; http://www.cppreference.com/wiki/</a><br style="font-family: 幼圆;"><span style="font-family: 幼圆;">&nbsp;&nbsp;&nbsp; C语言API参考</span><br style="font-family: 幼圆;"><span style="font-family: 幼圆;">&nbsp;&nbsp;&nbsp; C++语言std库参考</span><br style="font-family: 幼圆;"><a name="c_reference" id="c_reference"></a>  <img src ="http://www.cppblog.com/0OO/aggbug/95892.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/0OO/" target="_blank">零圈圈</a> 2009-09-11 10:58 <a href="http://www.cppblog.com/0OO/archive/2009/09/11/95892.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>