﻿<?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++博客-Thinking World</title><link>http://www.cppblog.com/willcao/</link><description>非澹泊无以明志,非宁静无以致远</description><language>zh-cn</language><lastBuildDate>Tue, 07 Apr 2026 15:45:51 GMT</lastBuildDate><pubDate>Tue, 07 Apr 2026 15:45:51 GMT</pubDate><ttl>60</ttl><item><title>Dynamic Programming 2: Numbers</title><link>http://www.cppblog.com/willcao/archive/2012/05/25/176124.html</link><dc:creator>MichaelCao</dc:creator><author>MichaelCao</author><pubDate>Fri, 25 May 2012 04:06:00 GMT</pubDate><guid>http://www.cppblog.com/willcao/archive/2012/05/25/176124.html</guid><description><![CDATA[1. 找出一个数组中，最大的一段连续的数的和。Find out the subarray which has the largest sum.<br />
例如：[1, -3, 2, -4 , 5 , 6, -2, 6, 7] 最大的和就是 22 = 5 + 6 - 2 + 6 +7.<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: #0000ff;">int</span>&nbsp;subMax(<span style="color: #0000FF; ">int</span>&nbsp;[]&nbsp;a)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;best&nbsp;= 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;sum&nbsp;=&nbsp;0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;a.length;&nbsp;i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;=&nbsp;sum&nbsp;+&nbsp;a[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(sum&nbsp;&lt;&nbsp;0&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;=&nbsp;0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>(sum&nbsp;&gt;&nbsp;best)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;best&nbsp;=&nbsp;sum;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;best;<br />
}</div>
想法就是一直加接下来的数，如果小于零就变为0，大于最大的数就更新。其中一点就是，如果遇到负数，
如果和不小于零就不用使sum为零。如果数组全部为负数，上面的代码有点问题，但不改了。如果想知道
这个最大的和的序列是什么，只要稍微改变就可以了，不说了。<br />
<br />
2.
Ugly Number: 找出第n个能被2，3，5整除的数<br />
例如：2, 3, 4, 5, 6, 9,10, 12, 15, 20, 25 ... 第3个是4， 第4个是5，第5个是6 ... 第200是？<br />
想法：首先是从 1开始，2，3，5分别乘1，最小的是2，接下来就是2，2的位置进1，3和5的位置不变
再来一次，最小的是3，3的位置进1，2和5位置进1，再来一次，最小的是4，3和5的位置不变。。。<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: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;uglyNum(&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;n)<br />
{<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;a&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">[n</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]<br />
&nbsp;&nbsp;&nbsp;a[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;i3&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;i5&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;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;n2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;n3&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;n5&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;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;m&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;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;n;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;a[i2]&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n3&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;a[i3]&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n5&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;a[i5]&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;min(n2,&nbsp;n3,&nbsp;n5);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(m&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;n2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[i]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;m;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i2</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">similar&nbsp;for&nbsp;i3&nbsp;and&nbsp;i5</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;a[n];<br />
}</span></div>
<br />
3. 最后一个问题：给 i, j 两个数，然后打印出 2^i ，5^j 的序列<br />
例如： i = 3 j =4 就打印出：<br />
2^0 * 5 ^0 = 1<br />
2^1 * 5^0 = 2<br />
2^2 * 5 ^0 = 4<br />
2^0 * 5^1 = 5<br />
2^3 * 5^0 = 8<br />
2^1 * 5^1 = 10<br />
...<br />
解法：和上面一个解法很相似，不过注意要处理相等的情况，比如2 * 2^1 * 5 ^1 = 20 2^2 * 5^0 ^5 = 20, 
代码就不写了。<img src ="http://www.cppblog.com/willcao/aggbug/176124.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/willcao/" target="_blank">MichaelCao</a> 2012-05-25 12:06 <a href="http://www.cppblog.com/willcao/archive/2012/05/25/176124.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Dynamic Programming 1: Strings</title><link>http://www.cppblog.com/willcao/archive/2012/05/23/175937.html</link><dc:creator>MichaelCao</dc:creator><author>MichaelCao</author><pubDate>Wed, 23 May 2012 14:03:00 GMT</pubDate><guid>http://www.cppblog.com/willcao/archive/2012/05/23/175937.html</guid><description><![CDATA[什么是DP? 简单地来说就是把一个问题分解成两个或者多个小问题。然后先把小的问题解出来，最后利用已经得到的答案，把大的问题解决。<br />它和分而治之有点类似，但有所不同。DP所分解出来的小问题会相互依赖，因此就不知道从哪里分。而分而治之的小问题不相互依赖。先看<br />个小程序吧，生成第n个Fibnacci数，可能有人会这么写<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: #0000FF; ">int</span>&nbsp;fib (&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n )&nbsp;{<br />&nbsp;&nbsp;<span style="color: #0000FF; ">if&nbsp;</span>( n&nbsp;==&nbsp;0 )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;1;<br />&nbsp;&nbsp;<span style="color: #0000FF; ">if&nbsp;</span>( n&nbsp;==&nbsp;1 )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;1;<br />&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fib ( n - 1 )&nbsp;+&nbsp;fib ( n - 2 );<br />}</div>但这个函数是2^n的递归，所以很快堆栈就会被用完的。另外如果思考一下，你会发现 fib( n - 1 ) 也已经要用到fib ( n - 2 ), 可是在<br />算fib ( n ) 的时候，这个值又要算一遍，那为什么不把这个值存下来呢？&nbsp;<br />好, 我们就换个DP的方式：<br /><div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">int</span>&nbsp;fib (&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n )&nbsp;{<br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if&nbsp;</span>( n&nbsp;==&nbsp;0&nbsp;||&nbsp;n&nbsp;==&nbsp;1 )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;1;<br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;[]&nbsp;f&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">int</span>[ n ];<br />&nbsp;&nbsp;&nbsp;f[ 0 ]&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;f[ 1 ]&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;i = 2;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f[ i ]&nbsp;=&nbsp;f[ i-1 ]&nbsp;+&nbsp;f[ i-2 ];<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;f[ n-1 ];<br />}</div>可能这个比较容易了。大家都明白，就是先把以前的值给算好，然后后面的计算就可以利用前面的值。嗯，那稍微换个难点的吧。给一个n*n的0,1 matrix，然后找到最大的全是1的submatrix的大小。比如：<br />00011<br />01111<br />11110<br />01110<br />这个最大的那个全是1的submatrix的大小就是3.看起来挺难，其实蛮容易的。<br />我们先用最平常的思路来解一下吧。<br />先初始化另外一个同样大小的n*n的matrix<br />第一行和第一列很容易，和原先一样的值<br />00011<br />0<br />0<br />1<br />0<br />接下来，算第二行，和其他的行。自己动手，你就知道其实就是<br /><span style="background-color: #eeeeee; font-size: 13px; ">s[i][j]&nbsp;</span><span style="background-color: #eeeeee; font-size: 13px; ">=</span><span style="background-color: #eeeeee; font-size: 13px; ">&nbsp;min(s[i][j</span><span style="background-color: #eeeeee; font-size: 13px; ">-</span><span style="background-color: #eeeeee; font-size: 13px; ">1</span><span style="background-color: #eeeeee; font-size: 13px; ">],s[i</span><span style="background-color: #eeeeee; font-size: 13px; ">-</span><span style="background-color: #eeeeee; font-size: 13px; ">1</span><span style="background-color: #eeeeee; font-size: 13px; ">][j],s[i</span><span style="background-color: #eeeeee; font-size: 13px; ">-</span><span style="background-color: #eeeeee; font-size: 13px; ">1</span><span style="background-color: #eeeeee; font-size: 13px; ">][j</span><span style="background-color: #eeeeee; font-size: 13px; ">-</span><span style="background-color: #eeeeee; font-size: 13px; ">1</span><span style="background-color: #eeeeee; font-size: 13px; ">])&nbsp;</span><span style="background-color: #eeeeee; font-size: 13px; ">+</span><span style="background-color: #eeeeee; font-size: 13px; ">&nbsp;</span><span style="background-color: #eeeeee; font-size: 13px; ">1<br /></span>我们顺便还可以加上一个max,记录最大的值。<br />这样这个就搞定了。DP介绍完毕。接下来开始关于String的DP<br /><hr />1.找到两个字符串的最大相同字串的长度<br />例如：abaabb aabbaa 最大的相同字串aabb长度就是4.<br />解法：给两个串 p,q 我们有<br />c(i,j) &nbsp;= 0 if p[i] != q[j]<br />c(i,j) &nbsp;= c(i-1,j-1) + 1 if p[i] = q[j].<br />代码和上面submatrix很相似。先初始化边缘，然后算出其他的值<br />2.找到两个字符串的最大subsequence的长度<br />例如：acbbab abbca 最大的subsequence is abba 长度是4.<br />解法：给两个串 p,q 我们有<br />c(i,j) = max(c(i-1,j),c(i,j-1)) if p[i] != q[j]<br />c(i,j) = c(i-1,j-1) + 1 if p[i] = q[j]<br />3.找到一个字符串最大的Palindrom<br />例如: abcdedcbdsa 最大的Palindrom就是bcdedcb 长度是7<br />解法：给一个串p<br />c(i,j) = max(c(i+1,j),c(i,j-1)) if p[i] != q[j]<br />c(i,j) = c(i+1,j-1) + 2 if p[i] = q[j]<br /><br /><br /> <div class="vimiumReset vimiumHUD" style="right: 150px; opacity: 0; display: none;"></div><img src ="http://www.cppblog.com/willcao/aggbug/175937.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/willcao/" target="_blank">MichaelCao</a> 2012-05-23 22:03 <a href="http://www.cppblog.com/willcao/archive/2012/05/23/175937.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Use the rsync to back up all files</title><link>http://www.cppblog.com/willcao/archive/2010/11/15/133651.html</link><dc:creator>MichaelCao</dc:creator><author>MichaelCao</author><pubDate>Mon, 15 Nov 2010 06:22:00 GMT</pubDate><guid>http://www.cppblog.com/willcao/archive/2010/11/15/133651.html</guid><wfw:comment>http://www.cppblog.com/willcao/comments/133651.html</wfw:comment><comments>http://www.cppblog.com/willcao/archive/2010/11/15/133651.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/willcao/comments/commentRss/133651.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/willcao/services/trackbacks/133651.html</trackback:ping><description><![CDATA[Here is the scripts:<br><br>rsync --progress --avze ssh --delete srcDir/&nbsp; remoteName@remoteMachine:remoteDir/<br><br>-a quick way to specify the recursion and preserve everything.<br>-v verbose<br>-z compress<br><br>And then change ssh with no password:<br>Create the private keys for local machine:<br>
<pre><code>ssh-keygen -t dsa<br></code></pre>
Copy the local keys to remote machine:<br><br>
<pre><code>ssh-copy-id -i ~/.ssh/id_dsa.pub remoteuser@remotebox<br></code></pre>
Do not set the password. <br><br>After that, add an alias into your .bashrc<br>alias bp='. ~/backup.sh'<br>So you can run bp directly to backup all things. <br>Over ~~~<br>   <img src ="http://www.cppblog.com/willcao/aggbug/133651.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/willcao/" target="_blank">MichaelCao</a> 2010-11-15 14:22 <a href="http://www.cppblog.com/willcao/archive/2010/11/15/133651.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何使用ramdisk in linux </title><link>http://www.cppblog.com/willcao/archive/2009/11/05/100205.html</link><dc:creator>MichaelCao</dc:creator><author>MichaelCao</author><pubDate>Thu, 05 Nov 2009 05:26:00 GMT</pubDate><guid>http://www.cppblog.com/willcao/archive/2009/11/05/100205.html</guid><wfw:comment>http://www.cppblog.com/willcao/comments/100205.html</wfw:comment><comments>http://www.cppblog.com/willcao/archive/2009/11/05/100205.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/willcao/comments/commentRss/100205.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/willcao/services/trackbacks/100205.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/willcao/archive/2009/11/05/100205.html'>阅读全文</a><img src ="http://www.cppblog.com/willcao/aggbug/100205.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/willcao/" target="_blank">MichaelCao</a> 2009-11-05 13:26 <a href="http://www.cppblog.com/willcao/archive/2009/11/05/100205.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何处理hadoop 无法启动</title><link>http://www.cppblog.com/willcao/archive/2009/11/03/100069.html</link><dc:creator>MichaelCao</dc:creator><author>MichaelCao</author><pubDate>Tue, 03 Nov 2009 11:38:00 GMT</pubDate><guid>http://www.cppblog.com/willcao/archive/2009/11/03/100069.html</guid><wfw:comment>http://www.cppblog.com/willcao/comments/100069.html</wfw:comment><comments>http://www.cppblog.com/willcao/archive/2009/11/03/100069.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/willcao/comments/commentRss/100069.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/willcao/services/trackbacks/100069.html</trackback:ping><description><![CDATA[<a href="http://www.michael-noll.com/wiki/Running_Hadoop_On_Ubuntu_Linux_%28Single-Node_Cluster%29">http://www.michael-noll.com/wiki/Running_Hadoop_On_Ubuntu_Linux_%28Single-Node_Cluster%29</a><br>很好的一篇文章，尤其是里面的禁用ipv6<img src ="http://www.cppblog.com/willcao/aggbug/100069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/willcao/" target="_blank">MichaelCao</a> 2009-11-03 19:38 <a href="http://www.cppblog.com/willcao/archive/2009/11/03/100069.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何在ubuntu中使用ssh</title><link>http://www.cppblog.com/willcao/archive/2009/10/20/99003.html</link><dc:creator>MichaelCao</dc:creator><author>MichaelCao</author><pubDate>Tue, 20 Oct 2009 02:07:00 GMT</pubDate><guid>http://www.cppblog.com/willcao/archive/2009/10/20/99003.html</guid><wfw:comment>http://www.cppblog.com/willcao/comments/99003.html</wfw:comment><comments>http://www.cppblog.com/willcao/archive/2009/10/20/99003.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/willcao/comments/commentRss/99003.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/willcao/services/trackbacks/99003.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ssh ubuntu&nbsp;&nbsp;<a href='http://www.cppblog.com/willcao/archive/2009/10/20/99003.html'>阅读全文</a><img src ="http://www.cppblog.com/willcao/aggbug/99003.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/willcao/" target="_blank">MichaelCao</a> 2009-10-20 10:07 <a href="http://www.cppblog.com/willcao/archive/2009/10/20/99003.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Signal And Await In java</title><link>http://www.cppblog.com/willcao/archive/2009/10/07/98020.html</link><dc:creator>MichaelCao</dc:creator><author>MichaelCao</author><pubDate>Wed, 07 Oct 2009 06:31:00 GMT</pubDate><guid>http://www.cppblog.com/willcao/archive/2009/10/07/98020.html</guid><wfw:comment>http://www.cppblog.com/willcao/comments/98020.html</wfw:comment><comments>http://www.cppblog.com/willcao/archive/2009/10/07/98020.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/willcao/comments/commentRss/98020.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/willcao/services/trackbacks/98020.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: MemoryFileSystem Java signal await&nbsp;&nbsp;<a href='http://www.cppblog.com/willcao/archive/2009/10/07/98020.html'>阅读全文</a><img src ="http://www.cppblog.com/willcao/aggbug/98020.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/willcao/" target="_blank">MichaelCao</a> 2009-10-07 14:31 <a href="http://www.cppblog.com/willcao/archive/2009/10/07/98020.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何在eclipse中设置java heap size</title><link>http://www.cppblog.com/willcao/archive/2009/10/06/97924.html</link><dc:creator>MichaelCao</dc:creator><author>MichaelCao</author><pubDate>Tue, 06 Oct 2009 02:31:00 GMT</pubDate><guid>http://www.cppblog.com/willcao/archive/2009/10/06/97924.html</guid><wfw:comment>http://www.cppblog.com/willcao/comments/97924.html</wfw:comment><comments>http://www.cppblog.com/willcao/archive/2009/10/06/97924.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/willcao/comments/commentRss/97924.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/willcao/services/trackbacks/97924.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: eclipse java heap size&nbsp;&nbsp;<a href='http://www.cppblog.com/willcao/archive/2009/10/06/97924.html'>阅读全文</a><img src ="http://www.cppblog.com/willcao/aggbug/97924.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/willcao/" target="_blank">MichaelCao</a> 2009-10-06 10:31 <a href="http://www.cppblog.com/willcao/archive/2009/10/06/97924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何在本机eclipse下调试Hadoop.</title><link>http://www.cppblog.com/willcao/archive/2009/09/29/97577.html</link><dc:creator>MichaelCao</dc:creator><author>MichaelCao</author><pubDate>Tue, 29 Sep 2009 13:21:00 GMT</pubDate><guid>http://www.cppblog.com/willcao/archive/2009/09/29/97577.html</guid><wfw:comment>http://www.cppblog.com/willcao/comments/97577.html</wfw:comment><comments>http://www.cppblog.com/willcao/archive/2009/09/29/97577.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/willcao/comments/commentRss/97577.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/willcao/services/trackbacks/97577.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Hadoop eclipse 安装&nbsp;&nbsp;<a href='http://www.cppblog.com/willcao/archive/2009/09/29/97577.html'>阅读全文</a><img src ="http://www.cppblog.com/willcao/aggbug/97577.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/willcao/" target="_blank">MichaelCao</a> 2009-09-29 21:21 <a href="http://www.cppblog.com/willcao/archive/2009/09/29/97577.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hadoop 纠错一</title><link>http://www.cppblog.com/willcao/archive/2009/09/28/97454.html</link><dc:creator>MichaelCao</dc:creator><author>MichaelCao</author><pubDate>Mon, 28 Sep 2009 05:32:00 GMT</pubDate><guid>http://www.cppblog.com/willcao/archive/2009/09/28/97454.html</guid><wfw:comment>http://www.cppblog.com/willcao/comments/97454.html</wfw:comment><comments>http://www.cppblog.com/willcao/archive/2009/09/28/97454.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/willcao/comments/commentRss/97454.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/willcao/services/trackbacks/97454.html</trackback:ping><description><![CDATA[在编译Hadoop后需要注意的几点<br>1.各个节点上的版本要相同。需要注意的是，编译后，程序运行就会从build文件夹里的class文件运行，所以即使你把jar包cp到根目录底下，仍然没用。删除build目录里面的jar包，还是没用。办法: ant clean<br>2.在使用一个新版本以后，可能会出现mapreduce能启动，但是dfs无法启动的情况。即使你format namenode还是不行。这个让我郁闷了好久。mapreduce 都可以启动，但就是dfs无法启动。datanode就是启动不了。想了好久，总算想明白了。因为datanode里面有数据，可是namenode里面却格式化了。办法：删除所有datanode中的数据。<br><br>使用ssh 远程执行命令<br>ssh gp09@***.comp.nus.edu.sg 'mkdir hadoop'<br>不过ssh有一个比较烦的地方，就是不能用cd命令。所以在使用的时候要小心。<br><br>在linux或者unix中安装ant<br>编辑.bashrc 文件<br>添加：<br>export ANT_HOME=~/files/....<br>export JAVA_HOME=/usr/lib/jvm/java-6-sun/jre/bin/java<br>export PATH=$(PATH):$(ANT_HOME)/bin<br>期中$表示提取变量，:表示在后面添加。<br><br><br><img src ="http://www.cppblog.com/willcao/aggbug/97454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/willcao/" target="_blank">MichaelCao</a> 2009-09-28 13:32 <a href="http://www.cppblog.com/willcao/archive/2009/09/28/97454.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于自旋锁和信号量的纠正</title><link>http://www.cppblog.com/willcao/archive/2008/12/10/69103.html</link><dc:creator>MichaelCao</dc:creator><author>MichaelCao</author><pubDate>Wed, 10 Dec 2008 12:49:00 GMT</pubDate><guid>http://www.cppblog.com/willcao/archive/2008/12/10/69103.html</guid><wfw:comment>http://www.cppblog.com/willcao/comments/69103.html</wfw:comment><comments>http://www.cppblog.com/willcao/archive/2008/12/10/69103.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/willcao/comments/commentRss/69103.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/willcao/services/trackbacks/69103.html</trackback:ping><description><![CDATA[&nbsp; 这个是在是应该纠正一下.因为以前什么都不知道.恩,看完linux 0.11的源代码后,顺便又看了Robert Love写的Linux Development,这里还是先推荐一下这本书吧.首先作者是大牛.不信的话,打开linux的2.6内核源代码,然后找sche.c.我想应该就能发现他的大名了.实在是令我崇拜阿.然后内容写的,整体来说还不错.尤其是前面那一部分.对于内核调度以及中断之类的分析.写的很好.后面的话,恩,个人觉得就有点不如前面的,思考的少了一点,应用多了一点.对于内核讲的就少了.而如何写驱动之类就多了.但不管怎么样,这本书真的是一本很不错的书.有看过linux 0.11源代码并且喜欢内核的可以看看.<br>&nbsp; 废话不多说了.首先从自旋锁的来源来看吧.说到这个就要说SMP,linux 在2.2的内核之后就加入了SMP的支持.一直到2.6越来越好.有SMP就有多个cpu的队列.每一个cpu都有一个自己的调度队列.这样在有些时候就需要平衡这些队列.这个时候就要用到锁,让其他cpu什么也不做.让一个cpu来更新这些队列.这个时候肯定是不能用信号量的(?).这样就出现了自旋锁.当然自旋锁的用途不止这里.比如说在中断中,进入临界区.信号量也是不能用的(?).这个时候就要用自旋锁,其他方面的话,我再回去看看.这样的话应该就很清楚了.信号量只是在进程中使用的.一般来说,应用级程序,你根本不用考虑自旋锁.没有SMP,也不用考虑了.因为代码编译以后只是禁止了内核抢占.这也就是说,这段代码不会被抢占,sleep什么的根本没用.如果是开发驱动方面的话,这个在必要的时候还是应该考虑一下.什么是必要的时候呢?就是上面我说的,进入中断临界区且有多个cpu.<br>&nbsp; <br><br>  <img src ="http://www.cppblog.com/willcao/aggbug/69103.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/willcao/" target="_blank">MichaelCao</a> 2008-12-10 20:49 <a href="http://www.cppblog.com/willcao/archive/2008/12/10/69103.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>函数指针的强制类型转换</title><link>http://www.cppblog.com/willcao/archive/2008/09/30/FunctionTest.html</link><dc:creator>MichaelCao</dc:creator><author>MichaelCao</author><pubDate>Tue, 30 Sep 2008 03:26:00 GMT</pubDate><guid>http://www.cppblog.com/willcao/archive/2008/09/30/FunctionTest.html</guid><wfw:comment>http://www.cppblog.com/willcao/comments/63074.html</wfw:comment><comments>http://www.cppblog.com/willcao/archive/2008/09/30/FunctionTest.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/willcao/comments/commentRss/63074.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/willcao/services/trackbacks/63074.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 指针应该都是4个字节,指向32位的地址.可以寻访4GB的内存.如果是64位就再说.所以对函数指针来说这个应该就有了很大的好处.因为指针大家都是4个字节不论是什么种类的函数,它肯定都是4字节.这样赋值就没问题.在这里你也可以将指针直接看成是一个整数.这样会更明白些.而对于另外一个问题.函数参数和返回值,则完全由函数的定义来决定.嗯.这样就可以有很大的自由空间.来段代码.
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std&nbsp;;<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>typedef&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pfn)&nbsp;(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>union&nbsp;msg<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img id=Codehighlighter1_80_148_Open_Image onclick="this.style.display='none'; Codehighlighter1_80_148_Open_Text.style.display='none'; Codehighlighter1_80_148_Closed_Image.style.display='inline'; Codehighlighter1_80_148_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_80_148_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_80_148_Closed_Text.style.display='none'; Codehighlighter1_80_148_Open_Image.style.display='inline'; Codehighlighter1_80_148_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_80_148_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_80_148_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;pfn&nbsp;first&nbsp;;<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;ifn)(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a&nbsp;,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;b&nbsp;);<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">vfn)(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;);<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;OnInt(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a&nbsp;,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;b&nbsp;)<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img id=Codehighlighter1_176_217_Open_Image onclick="this.style.display='none'; Codehighlighter1_176_217_Open_Text.style.display='none'; Codehighlighter1_176_217_Closed_Image.style.display='inline'; Codehighlighter1_176_217_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_176_217_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_176_217_Closed_Text.style.display='none'; Codehighlighter1_176_217_Open_Image.style.display='inline'; Codehighlighter1_176_217_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_176_217_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_176_217_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">b</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;a&nbsp;;<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;OnVoid(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a&nbsp;,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;b&nbsp;)<br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img id=Codehighlighter1_246_276_Open_Image onclick="this.style.display='none'; Codehighlighter1_246_276_Open_Text.style.display='none'; Codehighlighter1_246_276_Closed_Image.style.display='inline'; Codehighlighter1_246_276_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_246_276_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_246_276_Closed_Text.style.display='none'; Codehighlighter1_246_276_Open_Image.style.display='inline'; Codehighlighter1_246_276_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_246_276_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_246_276_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">a&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">b</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img id=Codehighlighter1_289_453_Open_Image onclick="this.style.display='none'; Codehighlighter1_289_453_Open_Text.style.display='none'; Codehighlighter1_289_453_Closed_Image.style.display='inline'; Codehighlighter1_289_453_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_289_453_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_289_453_Closed_Text.style.display='none'; Codehighlighter1_289_453_Open_Image.style.display='inline'; Codehighlighter1_289_453_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_289_453_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_289_453_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;pfn&nbsp;p</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(pfn)(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;))OnInt;<br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;msg&nbsp;m;<br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;m.first</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">p;<br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">(m.ifn)(</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(pfn)(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;))OnVoid;<br></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;m.first</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">p;<br></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;m.vfn(</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">15</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">30</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&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">31</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
看了这段代码会让人想到什么呢?想到的应该是MFC中那些消息函数吧.不同的消息,参数不一样,返回值也不一样.而在定义的时候只是一个指针,可是在调用的时候却有各种各样的方式.另外这段代码最有意思的就是打破常规,就用了union同时只有一个变量在起作用,平时书上总是说其他变量都不能用,今天就用给你看看,用的还很牛...
<img src ="http://www.cppblog.com/willcao/aggbug/63074.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/willcao/" target="_blank">MichaelCao</a> 2008-09-30 11:26 <a href="http://www.cppblog.com/willcao/archive/2008/09/30/FunctionTest.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于子进程和父进程--fork函数</title><link>http://www.cppblog.com/willcao/archive/2008/07/06/55490.html</link><dc:creator>MichaelCao</dc:creator><author>MichaelCao</author><pubDate>Sun, 06 Jul 2008 15:40:00 GMT</pubDate><guid>http://www.cppblog.com/willcao/archive/2008/07/06/55490.html</guid><wfw:comment>http://www.cppblog.com/willcao/comments/55490.html</wfw:comment><comments>http://www.cppblog.com/willcao/archive/2008/07/06/55490.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/willcao/comments/commentRss/55490.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/willcao/services/trackbacks/55490.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我总算有点眉目了.原来在fork()之后系统就有两个一样的进程了.以前一直晕,两个一样的进程?那有什么用啊?其实是fork()这个函数会返回两次而已.对于子进程,得到的是0,而对于父进程,得到却是子进程的pid,这样根据得到不同的pid,然后两个进程就可以进行不一样的运行了.并且子进程继承了父进程的数据段,代码段,这个也就是说变量阿还是有的,代码阿还是会运行的.
<br>&nbsp;&nbsp;&nbsp; 贴点代码稍稍解释一下:<br>
<div id="" style="border: 1px solid #100000; color: #70afff;">#include &lt;stdio.h&gt;<br>#include &lt;unistd.h&gt;<br>#include &lt;stdlib.h&gt;<br>#include &lt;errno.h&gt;<br><br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pid_t pid=fork();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pid==0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=0;j&lt;10;j++)<br>&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("child: %d\n",j);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sleep(1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (pid&gt;0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=0;i&lt;10;i++)<br>&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("parent: %d\n",i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sleep(1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr,"can't fork ,error %d\n",errno);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("This is the end !");<br>}<br></div>
&nbsp;&nbsp;&nbsp; 运行了这段代码,我想应该所有人都应该了解fork了吧.运行的时候可以查看进程(ps -aux),会发现有两个一样的进程,运行结束后最后一句printf会运行两次,因为每个进程都会运行一次.中间的交替就是进程的调度了.我也是刚刚明白,还有很多东西要深刻理解.总算有点眉目了.很爽.<br><br> <img src ="http://www.cppblog.com/willcao/aggbug/55490.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/willcao/" target="_blank">MichaelCao</a> 2008-07-06 23:40 <a href="http://www.cppblog.com/willcao/archive/2008/07/06/55490.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用代码来思考自旋锁和信号量</title><link>http://www.cppblog.com/willcao/archive/2008/04/30/48527.html</link><dc:creator>MichaelCao</dc:creator><author>MichaelCao</author><pubDate>Wed, 30 Apr 2008 08:45:00 GMT</pubDate><guid>http://www.cppblog.com/willcao/archive/2008/04/30/48527.html</guid><wfw:comment>http://www.cppblog.com/willcao/comments/48527.html</wfw:comment><comments>http://www.cppblog.com/willcao/archive/2008/04/30/48527.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/willcao/comments/commentRss/48527.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/willcao/services/trackbacks/48527.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 觉得昨天的思考似乎还是不怎么过瘾,有些问题还不是很清楚.到底应用方面两个有什么区别呢?<br>自己学着别人小小的动了下手.<br>先贴信号量的代码.
<div id="" style="border: 1px solid #666666; color: #789aff;">#include&lt;pthread.h&gt;<br>#include&lt;stdio.h&gt;<br>#include&lt;sys/time.h&gt;<br><br>#define MAX 10<br>pthread_t thread[2];<br>pthread_mutex_t mut;<br>int number=0,i;<br><br>void * thread1()<br>{<br>&nbsp;&nbsp; &nbsp;printf("thread1: I'm thread 1 \n");<br>&nbsp;&nbsp; &nbsp;for(i =0;i&lt;MAX ;i++)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("thread 1: number=%d \n",number);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pthread_mutex_lock(&amp;mut);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;number++;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pthread_mutex_unlock(&amp;mut);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;sleep(2);<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;printf("thread1: 主函数在等我完成任务吗？\n");<br>&nbsp;&nbsp; &nbsp;pthread_exit(NULL);<br>}<br>void *&nbsp; thread2()<br>{<br>&nbsp;&nbsp; &nbsp;printf("thread2: I'm thread 2 \n");<br>&nbsp;&nbsp; &nbsp;for(i =0; i&lt;MAX;i++)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("thread2 : number=%d\n",number);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pthread_mutex_lock(&amp;mut);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;number++;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pthread_mutex_unlock(&amp;mut);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;sleep(3);<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;printf("thread2 : 主函数在等我完成任务么？\n");<br>&nbsp;&nbsp; &nbsp;pthread_exit(NULL);<br><br>}<br><br>void thread_create(void)<br>{<br>&nbsp;&nbsp; &nbsp;/*创建线程*/<br>&nbsp;&nbsp; &nbsp;pthread_create(&amp;thread[0],NULL,thread1,NULL);<br>&nbsp;&nbsp; &nbsp;printf("线程1被创建！\n");<br>&nbsp;&nbsp; &nbsp;pthread_create(&amp;thread[1],NULL,thread2,NULL);<br>&nbsp;&nbsp; &nbsp;printf("线程2被创建！\n");<br>}<br>void thread_wait(void)<br>{<br>&nbsp;&nbsp; &nbsp;/*等待线程结束*/<br>&nbsp;&nbsp; &nbsp;pthread_join(thread[0],NULL);<br>&nbsp;&nbsp; &nbsp;printf("线程1已经结束！\n");<br>&nbsp;&nbsp; &nbsp;pthread_join(thread[1],NULL);<br>&nbsp;&nbsp; &nbsp;printf("线程2已经结束!\n");<br>}<br>int main()<br>{<br>&nbsp;&nbsp; &nbsp;/*用默认属性初始化互斥锁*/<br>&nbsp;&nbsp; &nbsp;pthread_mutex_init(&amp;mut,NULL);<br>&nbsp;&nbsp; &nbsp;printf("我是主函数，我正在创建线程！\n");<br>&nbsp;&nbsp; &nbsp;thread_create();<br>&nbsp;&nbsp; &nbsp;printf("我是主函数，我正在等待线程完成任务！\n");<br>&nbsp;&nbsp; &nbsp;thread_wait();<br>}
<br></div>
<br>执行的结果是:<br>
<div id="" style="border: 1px solid #666666; color: #7880ff;">我是主函数，我正在创建线程！<br>thread1: I'm thread 1 <br>thread 1: number=0 <br>线程1被创建！<br>thread2: I'm thread 2 <br>thread2 : number=1<br>线程2被创建！<br>我是主函数，我正在等待线程完成任务！<br>thread 1: number=2 <br>thread2 : number=3<br>thread 1: number=4 <br>thread 1: number=5 <br>thread2 : number=6<br>thread 1: number=7 <br>thread2 : number=8<br>thread 1: number=9 <br>thread2 : number=10<br>thread1: 主函数在等我完成任务吗？<br>线程1已经结束！<br>thread2 : 主函数在等我完成任务么？<br>线程2已经结束!<br><br></div>
&nbsp;<span style="color: #20ff2d;">重要:<span style="color: #000200;">这个执行的过程大概要10秒!!!!!!<br>而我们用自旋锁,代码:<br>
<div id="" style="border: 1px solid #666666; color: #7880f0;">/*<br>&nbsp;* time :2008.4.30<br>&nbsp;* author:will cao<br>&nbsp;* Email:sei_michael@126.com<br>&nbsp;* 探索自旋锁与信号量的区别<br>&nbsp;*/<br>#include&lt;pthread.h&gt;<br>#include&lt;stdio.h&gt;<br><br>pthread_t thread[2];<br>pthread_spinlock_t lock ;<br><br>#define MAX 10 <br><br>int number=0,i;<br><br>void * thread1()<br>{<br>&nbsp;&nbsp; &nbsp;printf ("thread 1 :I began to run !");<br>&nbsp;&nbsp; &nbsp;for(i=0;i&lt;MAX;i++)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("thread 1 :number=%d \n",number);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pthread_spin_lock(&amp;lock);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;number++;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pthread_spin_unlock(&amp;lock);<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;printf("ok ,I am over !\n");<br>&nbsp;&nbsp; &nbsp;pthread_exit(NULL);<br>}<br>void * thread2 ()<br>{<br>&nbsp;&nbsp; &nbsp;printf("thread2 : I start !!!\n");<br>&nbsp;&nbsp; &nbsp;for(i=0;i&lt;MAX;i++)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("thread2 : number = %d \n",number);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pthread_spin_lock(&amp;lock);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;number++;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pthread_spin_unlock(&amp;lock);<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;printf("thread 2: I am over!!!");<br>&nbsp;&nbsp; &nbsp;pthread_exit(NULL);<br>}<br><br>void thread_create(void)<br>{<br>&nbsp;&nbsp; &nbsp;/*create the threads */<br>&nbsp;&nbsp; &nbsp;pthread_create(&amp;thread[0],NULL,thread1,NULL);<br>&nbsp;&nbsp; &nbsp;printf("create the thread 1\n ");<br>&nbsp;&nbsp; &nbsp;pthread_create(&amp;thread[1],NULL,thread2,NULL);<br>&nbsp;&nbsp; &nbsp;printf("create the thread 2 \n");<br>}<br>void thread_wait(void )<br>{<br>&nbsp;&nbsp; &nbsp;/*wait for the thread to be over */<br>&nbsp;&nbsp; &nbsp;pthread_join(thread[0],NULL);<br>&nbsp;&nbsp; &nbsp;printf("the thread 1 is over !\n");<br>&nbsp;&nbsp; &nbsp;pthread_join(thread[1],NULL);<br>&nbsp;&nbsp; &nbsp;printf("the thread 2 is over ! \n");<br>}<br>int main()<br>{<br>&nbsp;&nbsp; &nbsp;/* init the spin lock */<br>&nbsp;&nbsp; &nbsp;pthread_spin_init(&amp;lock,0);<br>&nbsp;&nbsp; &nbsp;printf("i am the main,and I am creating the threads ");<br>&nbsp;&nbsp; &nbsp;thread_create();<br>&nbsp;&nbsp; &nbsp;printf("i am the main,and I am wait for the thread to be over!");<br>&nbsp;&nbsp; &nbsp;thread_wait();<br>}
<br></div>
&nbsp;执行结果为:<br>
<div id="" style="border: 1px solid #666666; color: #7880f0;">i am the main,and I am creating the threads thread 1 :I began to run !thread 1 :number=0 <br>thread 1 :number=1 <br>thread 1 :number=2 <br>thread 1 :number=3 <br>thread 1 :number=4 <br>thread 1 :number=5 <br>thread 1 :number=6 <br>thread 1 :number=7 <br>thread 1 :number=8 <br>thread 1 :number=9 <br>ok ,I am over !<br>create the thread 1<br>&nbsp;thread2 : I start !!!<br>create the thread 2 <br>i am the main,and I am wait for the thread to be over!thread2 : number = 10 <br>thread2 : number = 11 <br>thread2 : number = 12 <br>thread2 : number = 13 <br>thread2 : number = 14 <br>thread2 : number = 15 <br>thread2 : number = 16 <br>thread2 : number = 17 <br>thread2 : number = 18 <br>thread2 : number = 19 <br>thread 2: I am over!!!the thread 1 is over !<br>the thread 2 is over ! <br></div>
&nbsp;&nbsp; 执行时间:我没用系统调用,但肯定是用不了0.1秒的...<br>总结:从表面上来看,很明显的区别是当我们用的是信号量的时候,这个时候是有调度的.因为从运行结果上来看,主线程在创建其他两个线程后,其他线程开始运行.并且主线程也在运行.但怎么运行这个是无法确定的,这是一个并发的过程.<br>&nbsp;&nbsp;&nbsp;  当使用自旋锁后,这个就不一样了.当运行到临界区的时候,它是直接的过去,不是会产生一个等待,或者一个调度.<br>不知道编译器是怎么编译的.很想知道编译后二进制代码有什么区别.但这个好像有点太难....不过我觉得从运行结果上来看这么多,应该差不多了.<br></span></span><br><br><img src ="http://www.cppblog.com/willcao/aggbug/48527.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/willcao/" target="_blank">MichaelCao</a> 2008-04-30 16:45 <a href="http://www.cppblog.com/willcao/archive/2008/04/30/48527.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>信号量与自旋锁</title><link>http://www.cppblog.com/willcao/archive/2008/04/30/48496.html</link><dc:creator>MichaelCao</dc:creator><author>MichaelCao</author><pubDate>Tue, 29 Apr 2008 17:32:00 GMT</pubDate><guid>http://www.cppblog.com/willcao/archive/2008/04/30/48496.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;刚刚开始想这个问题的时候,觉得好像这个根本就不是一个问题.学操作系统的进程间的通信时,就是先说用互斥锁解决两个进程同时访问临界区的方法.但是后来Dijkstra对于哲学家进餐的问题的解答使用了信号量,于是我们接受了信号量.在看pthread的时候,发现还有个自旋锁.于是有点晕,这两个不都是控制对临界区的访问的么?怎么都上来了?他们之间有什么区别,他们又都是怎么实现的?<br>&nbsp;&nbsp;&nbsp;首先说自旋锁.这个实现基本上是和TSL相同.TSL指令,首先是要共享一个lock,当进入临界区时,首先将lock复制到寄存器,然后将lock置为1,接下来看寄存器中的值是否为0,为0进入.不为0返回.而最重要的是它能保证指令执行的不可分割性,也就是说在这条指令结束之前,其他指令不允许访问内存.实现的是方式是在指令执行之前将内存总线禁止.结束后在打开内存总线.而自旋锁实现就是这个样子.只不过多循环了几次.为了更好的让cpu调度,在尝试一定次数后返回.因为他是一直在那边循环所以叫做自旋锁.可见这种锁很耗资源.但是速度上来说很快.一旦锁释放,立刻可以得到资源.<br>&nbsp;&nbsp;&nbsp;再来看看信号量,信号量的实现就不这般精准了.如果使用一个信号量来控制一个临界区的话.就会有很多情况,首先最明显的是读者-写者问题.可以有多个读者,写者只可以有一个.并且信号量的实现也和自旋锁有者一定的区别.当一个信号量不能访问后.进程不会在那里循环,会被睡眠掉.当信号量可以使用的时候,调度器会从可以调度的进程选择一个.<br>&nbsp;&nbsp;&nbsp;基本上就这个样子.
<img src ="http://www.cppblog.com/willcao/aggbug/48496.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/willcao/" target="_blank">MichaelCao</a> 2008-04-30 01:32 <a href="http://www.cppblog.com/willcao/archive/2008/04/30/48496.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>小斋寄语</title><link>http://www.cppblog.com/willcao/archive/2008/04/28/48290.html</link><dc:creator>MichaelCao</dc:creator><author>MichaelCao</author><pubDate>Sun, 27 Apr 2008 16:13:00 GMT</pubDate><guid>http://www.cppblog.com/willcao/archive/2008/04/28/48290.html</guid><wfw:comment>http://www.cppblog.com/willcao/comments/48290.html</wfw:comment><comments>http://www.cppblog.com/willcao/archive/2008/04/28/48290.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/willcao/comments/commentRss/48290.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/willcao/services/trackbacks/48290.html</trackback:ping><description><![CDATA[<p>&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; 望多思,多想,多记.珍惜青春.</p>
<img src ="http://www.cppblog.com/willcao/aggbug/48290.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/willcao/" target="_blank">MichaelCao</a> 2008-04-28 00:13 <a href="http://www.cppblog.com/willcao/archive/2008/04/28/48290.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>