﻿<?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++基础</title><link>http://www.cppblog.com/fdsajhg/category/14551.html</link><description>管理系统--&lt;</description><language>zh-cn</language><lastBuildDate>Thu, 09 Sep 2010 01:19:54 GMT</lastBuildDate><pubDate>Thu, 09 Sep 2010 01:19:54 GMT</pubDate><ttl>60</ttl><item><title> 基础常用</title><link>http://www.cppblog.com/fdsajhg/archive/2010/09/04/125853.html</link><dc:creator>傅先生</dc:creator><author>傅先生</author><pubDate>Sat, 04 Sep 2010 01:39:00 GMT</pubDate><guid>http://www.cppblog.com/fdsajhg/archive/2010/09/04/125853.html</guid><wfw:comment>http://www.cppblog.com/fdsajhg/comments/125853.html</wfw:comment><comments>http://www.cppblog.com/fdsajhg/archive/2010/09/04/125853.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fdsajhg/comments/commentRss/125853.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fdsajhg/services/trackbacks/125853.html</trackback:ping><description><![CDATA[<br><br>//数值定义问题 链表<br>对象，指针<br><br><br><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;&nbsp;&nbsp;&nbsp;&nbsp; //#include &lt;alloc.h&gt;<br>1,&nbsp;&nbsp;char *p=new char[500];&nbsp; delete []p; <br>2,char *p=(char *)malloc(100);&nbsp; free(p);&nbsp; <br>3, char *p=(char *)calloc(100,sizeof(char)); free(p);<br><br><br><br><br>
<img src ="http://www.cppblog.com/fdsajhg/aggbug/125853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fdsajhg/" target="_blank">傅先生</a> 2010-09-04 09:39 <a href="http://www.cppblog.com/fdsajhg/archive/2010/09/04/125853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>define的用法</title><link>http://www.cppblog.com/fdsajhg/archive/2010/08/25/124601.html</link><dc:creator>傅先生</dc:creator><author>傅先生</author><pubDate>Tue, 24 Aug 2010 16:50:00 GMT</pubDate><guid>http://www.cppblog.com/fdsajhg/archive/2010/08/25/124601.html</guid><wfw:comment>http://www.cppblog.com/fdsajhg/comments/124601.html</wfw:comment><comments>http://www.cppblog.com/fdsajhg/archive/2010/08/25/124601.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fdsajhg/comments/commentRss/124601.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fdsajhg/services/trackbacks/124601.html</trackback:ping><description><![CDATA[<div class=tit>define的用法</div>
<div class=date>2007-12-22 08:04</div>
<table style="TABLE-LAYOUT: fixed; WIDTH: 100%">
    <tbody>
        <tr>
            <td>
            <div class=cnt id=blog_text>
            <div class="sysBr500 text" align=left>
            <div>1.简单的define定义<br><br>#define MAXTIME 1000<br><br>一个简单的MAXTIME就定义好了，它代表1000，如果在程序里面写<br><br>if(i&lt;MAXTIME){.........}<br><br>编译器在处理这个代码之前会对MAXTIME进行处理替换为1000。<br><br><span style="COLOR: brown">这样的定义看起来类似于普通的常量定义CONST，但也有着不同，因为define的定义更像是简单的文本替换，而不是作为一个量来使用，这个问题在下面反映的尤为突出。</span><br><br>2.define的&#8220;函数定义&#8221;<br><br>define可以像函数那样接受一些参数，如下<br><br>#define max(x,y) (x)&gt;(y)?(x):(y);<br><br>这个定义就将返回两个数中较大的那个，看到了吗？因为这个&#8220;函数&#8221;没有类型检查，就好像一个函数模板似的，当然，它绝对没有模板那么安全就是了。可以作为一个简单的模板来使用而已。<br><br><span style="COLOR: purple">但是这样做的话存在隐患</span>，例子如下：<br>#define Add(a,b) a+b;<br>在一般使用的时候是没有问题的，但是如果遇到如：c * Add(a,b) * d的时候就会出现问题，代数式的本意是a+b然后去和c，d相乘，但是因为使用了define（它只是一个简单的替换），所以式子实际上变成了<br>c*a + b*d<br><br>另外举一个例子：<br>#define pin (int*);<br>pin a,b;<br>本意是a和b都是int型指针，但是实际上变成int* a,b;<br>a是int型指针，而b是int型变量。<br>这是应该使用typedef来代替define，这样a和b就都是int型指针了。<br><br>所以我们在定义的时候，养成一个良好的习惯，建议所有的层次都要加括号。<br><br>3.宏的单行定义<br>#define A(x) T_##x<br>#define B（x) #@x<br><br>#define C（x) #x<br>我们假设：x=1，则有：<br>A(1)------〉T_1<br>B(1)------〉'1'<br>C(1)------〉"1"<br><br>（这里参考了 hustli的文章）<br><br>3.define的多行定义<br><br>define可以替代多行的代码，例如MFC中的宏定义（非常的经典，虽然让人看了恶心）<br><br>#define MACRO(arg1, arg2) do { \<br>/* declarations */ \<br>stmt1; \<br>stmt2; \<br>/* ... */ \<br>} while(0) /* (no trailing ; ) */<br>关键是要在每一个换行的时候加上一个"\"<br><br><br>4.在大规模的开发过程中，特别是跨平台和系统的软件里，define最重要的功能是条件编译。<br><br>就是：<br>#ifdef WINDOWS<br>......<br>......<br>#endif<br>#ifdef LINUX<br>......<br>......<br>#endif<br><br>可以在编译的时候通过#define设置编译环境<br><br>5.如何定义宏、取消宏<br><br>//定义宏<br>#define [MacroName] [MacroValue]<br>//取消宏<br>#undef [MacroName]<br>普通宏<br>#define PI (3.1415926)<br><br>带参数的宏<br>#define max(a,b) ((a)&gt;(b)? (a),(b))<br>关键是十分容易产生错误，包括机器和人理解上的差异等等。<br><br>6.条件编译<br>#ifdef XXX&#8230;(#else) &#8230;#endif<br>例如 #ifdef DV22_AUX_INPUT<br>#define AUX_MODE 3<br>#else<br>#define AUY_MODE 3<br>＃endif<br>#ifndef XXX &#8230; (#else) &#8230; #endif<br><br>7.头文件(.h)可以被头文件或C文件包含；<br>重复包含（重复定义）<br>由于头文件包含可以嵌套，那么C文件就有可能包含多次同一个头文件，就可能出现重复定义的问题的。<br>通过条件编译开关来避免重复包含（重复定义）<br>例如<br>#ifndef __headerfileXXX__<br>＃define __headerfileXXX__<br>&#8230;<br>文件内容<br>&#8230;<br>#endif</div>
            </div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cppblog.com/fdsajhg/aggbug/124601.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fdsajhg/" target="_blank">傅先生</a> 2010-08-25 00:50 <a href="http://www.cppblog.com/fdsajhg/archive/2010/08/25/124601.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>switch-case语句用法</title><link>http://www.cppblog.com/fdsajhg/archive/2010/08/25/124600.html</link><dc:creator>傅先生</dc:creator><author>傅先生</author><pubDate>Tue, 24 Aug 2010 16:47:00 GMT</pubDate><guid>http://www.cppblog.com/fdsajhg/archive/2010/08/25/124600.html</guid><wfw:comment>http://www.cppblog.com/fdsajhg/comments/124600.html</wfw:comment><comments>http://www.cppblog.com/fdsajhg/archive/2010/08/25/124600.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fdsajhg/comments/commentRss/124600.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fdsajhg/services/trackbacks/124600.html</trackback:ping><description><![CDATA[<div class=tit>switch-case语句用法</div>
<div class=date>2007-12-25 08:11</div>
<table style="TABLE-LAYOUT: fixed; WIDTH: 100%">
    <tbody>
        <tr>
            <td>
            <div class=cnt id=blog_text>
            <p><font size=2>if语句处理两个分支,处理多个分支时需使用if-else-if结构,但如果分支较多,则嵌套的if语句层就越多,程序不但庞大而且理解也比较困难.因此,C语言又提供了一个专门用于处理多分支结构的条件选择语句,称为<span style="COLOR: red">switch语句</span>,又称开关语句.使用switch语句直接处理多个分支(当然包括两个分支).其一般形式为: </font></p>
            <p>
            <table cellSpacing=0 cellPadding=4 width="90%" align=center>
                <tbody>
                    <tr>
                        <td><font size=2>引用
                        <hr align=center width="100%">
                        </font><span style="COLOR: red"><font size=2>switch(表达式)<br>{ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 常量表达式1:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 语句1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 常量表达式2:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 语句2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; </font>
                        <p><font size=2></font></p>
                        <p><font size=2>&#8230;&#8230;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 常量表达式n:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 语句n;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; </font></p>
                        <p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 语句n+1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>}</font></p>
                        <font size=2>
                        <hr align=center width="100%">
                        </font></span></td>
                    </tr>
                </tbody>
            </table>
            <br><font size=2>switch语句的执行流程是:首先计算switch后面圆括号中表达式的值,然后用此值依次与各个case的常量表达式比较,若圆括号中表达式的值与某个case后面的常量表达式的值相等,就执行此case后面的语句,执行后遇break语句就退出switch语句;若圆括号中表达式的值与所有case后面的常量表达式都不等,则执行default后面的语句n+1,然后退出switch语句,程序流程转向开关语句的下一个语句.如下程序,可以根据输入的考试成绩的等级,输出百分制分数段: </font></p>
            <p>
            <table cellSpacing=0 cellPadding=4 width="90%" align=center>
                <tbody>
                    <tr>
                        <td><font size=2>引用
                        <hr align=center width="100%">
                        switch(grade)<br>{ <br>&nbsp;&nbsp;&nbsp; case 'A': /*注意,这里是冒号:并不是分号;*/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("85-100\n");<br>&nbsp;&nbsp;&nbsp; break; /*每一个case语句后都要跟一个break用来退出switch语句*/<br>&nbsp;&nbsp;&nbsp; case 'B': /*每一个case后的常量表达式必须是不同的值以保证分支的唯一性*/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("70-84\n");<br>&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; case 'C':<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("60-69\n");<br>&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; case 'D':<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("&lt;60\n");<br>&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; default:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("error!\n");<br>}
                        <hr align=center width="100%">
                        </font></td>
                    </tr>
                </tbody>
            </table>
            <br><font size=2>(2) 如果在case后面包含多条执行语句时,也不需要像if语句那样加大括号,进入某个case后,会自动顺序执行本case后面的所有执行语句.如: </font></p>
            <p>
            <table cellSpacing=0 cellPadding=4 width="90%" align=center>
                <tbody>
                    <tr>
                        <td><font size=2>引用
                        <hr align=center width="100%">
                        { <br>&nbsp;&nbsp;&nbsp; case 'A':<br>&nbsp;&nbsp;&nbsp;&nbsp; if(grade&lt;=100)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("85-100\n");<br>&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("error\n");<br>&nbsp;&nbsp;&nbsp; break;<br>&#8230;&#8230;
                        <hr align=center width="100%">
                        </font></td>
                    </tr>
                </tbody>
            </table>
            <br><font size=2>(3) <span style="COLOR: red">default总是放在最后</span>,这时default后不需要break语句.并且,<span style="COLOR: blue">default部分也不是必须的</span>,如果没有这一部分,当switch后面圆括号中表达式的值与所有case后面的常量表达式的值都不相等时,则不执行任何一个分支直接退出switch语句.此时,switch语句相当于一个空语句.例如,将上面例子中switch语句中的default部分去掉,则当输入的字符不是"A","B","C"或"D"时,此switch语句中的任何一条语句也不被执行. </font></p>
            <p><font size=2>(4) 在switch-case语句中,多个case可以共用一条执行语句,如: </font></p>
            <p>
            <table cellSpacing=0 cellPadding=4 width="90%" align=center>
                <tbody>
                    <tr>
                        <td><font size=2>引用
                        <hr align=center width="100%">
                        &#8230;&#8230;<br>case 'A':<br>case 'B':<br>case 'c':<br>printf("&gt;60\n");<br>break;<br>&#8230;&#8230;
                        <hr align=center width="100%">
                        </font></td>
                    </tr>
                </tbody>
            </table>
            <br><font size=2>在A,B,C3种情况下,均执行相同的语句,即输出"&gt;60". </font></p>
            <p><font size=2>(5) 最开始那个例子中,如果把每个case后的break删除掉,则当greak='A'时,程序从printf("85-100\n")开始执行,输出结果为: </font></p>
            <p>
            <table cellSpacing=0 cellPadding=4 width="90%" align=center>
                <tbody>
                    <tr>
                        <td><font size=2>引用
                        <hr align=center width="100%">
                        85-100<br>70-84<br>60-69<br>&lt;60<br>error
                        <hr align=center width="100%">
                        </font></td>
                    </tr>
                </tbody>
            </table>
            <br><font size=2>这是因为case后面的常量表达式实际上只起语句标号作用,而不起条件判断作用,即"<span style="COLOR: red">只是开始执行处的入口标号</span>".因此,一旦与switch后面圆括号中表达式的值匹配,就从此标号处开始执行,而且执行完一个case后面的语句后,若没遇到break语句,就自动进入下一个case继续执行,而不在判断是否与之匹配,直到遇到break语句才停止执行,退出break语句.因此,若想执行一个case分之后立即跳出switch语句,就必须在此分支的最后添加一个break语句. </font></p>
            <p>
            <table cellSpacing=0 cellPadding=4 width="90%" align=center>
                <tbody>
                    <tr>
                        <td><font size=2>引用
                        <hr align=center width="100%">
                        main() /*完成两个数简单的四则运算*/<br>{ <br>&nbsp;&nbsp; float a,b;<br>&nbsp;&nbsp; char c1;<br>&nbsp;&nbsp; printf("Please enter a,b and op:");<br>&nbsp;&nbsp; scanf("%f%c%f",&amp;a,&amp;c1,&amp;b);<br>&nbsp;&nbsp; switch(c1)<br>&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '+':<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%f+%f=%f\n",a,b,a+b);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '-':<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%f-%f=%f\n",a,b,a-b);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '*':<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%f*%f=%f\n",a,b,a*b);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '/':<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(b!=0.0) /*分母不能等于0*/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%f/%f=%f\n",a,b,a/b);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("error!\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("error!\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp; }<br>} </font></td>
                    </tr>
                </tbody>
            </table>
            </p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cppblog.com/fdsajhg/aggbug/124600.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fdsajhg/" target="_blank">傅先生</a> 2010-08-25 00:47 <a href="http://www.cppblog.com/fdsajhg/archive/2010/08/25/124600.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C/C++ 简单的多线程编程</title><link>http://www.cppblog.com/fdsajhg/archive/2010/08/12/123163.html</link><dc:creator>傅先生</dc:creator><author>傅先生</author><pubDate>Thu, 12 Aug 2010 03:48:00 GMT</pubDate><guid>http://www.cppblog.com/fdsajhg/archive/2010/08/12/123163.html</guid><wfw:comment>http://www.cppblog.com/fdsajhg/comments/123163.html</wfw:comment><comments>http://www.cppblog.com/fdsajhg/archive/2010/08/12/123163.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fdsajhg/comments/commentRss/123163.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fdsajhg/services/trackbacks/123163.html</trackback:ping><description><![CDATA[<p align=center>C/C++ 简单的多线程<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E7%BC%96%E7%A8%8B">编程</span></p>
<br>.
<div class=blockcode>
<div id=code0>
<ol>
    <li>#include &lt;windows.h&gt; //『注意1』由于CreateThread()是API<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E5%87%BD%E6%95%B0">函数</span>，所以，必须包含这个头<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E6%96%87%E4%BB%B6">文件</span><br>
    <li>#include &lt;iostream&gt;<br>
    <li>using namespace std;<br>
    <li>DWORD WINAPI Thread1Proc( LPVOID lpParameter); //线程的执行函数<br>
    <li>DWORD WINAPI Thread2Proc( LPVOID lpParameter); //线程的执行函数<br>
    <li>int a;<br>
    <li>int b;<br>
    <li>int c;<br>
    <li>int temp(0);<br>
    <li>int sum(0);<br>
    <li>int main()<br>
    <li>{<br>
    <li>a=1;<br>
    <li>b=2;<br>
    <li>c=3;<br>
    <li>HANDLE hThread1=CreateThread(NULL,0,Thread1Proc,NULL,0,NULL); //『注意2』创建线程1<br>
    <li>HANDLE hThread2=CreateThread(NULL,0,Thread2Proc,NULL,0,NULL); //创建线程2<br>
    <li>CloseHandle(hThread1); //关闭标识线程1的句柄<br>
    <li>CloseHandle(hThread2); //关闭标识线程2的句柄<br>
    <li>Sleep(5); //『注意3』主线程放弃执行权，睡眠毫秒，以使线程和线程得到执行机会<br>
    <li>sum=temp; //主线程的执行语句<br>
    <li>cout&lt;&lt;"sum="&lt;&lt;sum&lt;&lt;endl; //主线程的执行语句<br>
    <li>return 0;<br>
    <li>}<br>
    <li>DWORD WINAPI Thread1Proc( LPVOID lpParameter)<br>
    <li>{<br>
    <li>temp=a+b;<br>
    <li>return 0;<br>
    <li>}<br>
    <li>DWORD WINAPI Thread2Proc( LPVOID lpParameter)<br>
    <li>{<br>
    <li>temp+=c;<br>
    <li>return 0;<br>
    <li>}</li>
</ol>
</div>
<em onclick="copycode($('code0'));">复制<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E4%BB%A3%E7%A0%81">代码</span></em></div>
代码说明：本代码简单演示了多线程的创建方法。<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E7%A8%8B%E5%BA%8F">程序</span>用包括主线程在内的三个线程共同完成sum=a+b+c并输出计算结果的<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E5%8A%9F%E8%83%BD">功能</span>。其中，线程1完成a+b这一步，线程2完成将a+b的结果与c相加这一步，主线程完成输出计算结果这一步。整个程序很简单，一目了然，但是，依然有几个地方需要注意：<br><br>&nbsp; &nbsp; 「注意1」由于创建线程所<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E4%BD%BF%E7%94%A8">使用</span>的函数CreateThread（）是windows API函数，所以，必须包含头文件windows.h<br><br>&nbsp; &nbsp;&nbsp; &nbsp;「注意2」CreateThread（）函数有一个HANDLE 类型的返回值，用来标识创建的线程，因此，应该定义一个HANDLE类型的<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E5%8F%98%E9%87%8F">变量</span>用于保存这个句柄（不是必须）。线程创建完成之后，如果不需要使用这个句柄变量，应当将其关闭，以释放<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E7%B3%BB%E7%BB%9F">系统</span>资源。关闭句柄的方法是调用CloseHandle（）函数。<br><br>&nbsp; &nbsp; 「注意3」这里的Sleep（）函数的作用是使主线程放弃执行机会，让其它线程开始执行。因为这个程序主线程内运行的代码很短，就两条短语句，同常情况，这两条语句在一个系统时间片内就能跑完，然后就执行return语句返回，主线程就运行结束了。主线程一结束，程序就终止，线程1和线程2将再也得不到执行机会。<br><br>&nbsp; &nbsp;&nbsp;&nbsp;我们可以将Sleep（）注释起来，然后运行程序，观察打印出来的sum值即可以发现线程1和线程2是否得到运行机会。当然，Sleep（）不是必须的，这从系统调度线程的方式可以看出来，多线程程序在开始运行时，系统会首先让主线程执行一段时间（时间片）。<br><br>&nbsp; &nbsp;&nbsp;&nbsp;如果主线程在这个时间段内将所有代码都执行完了，程序就结束，否则，就将主线程挂起，然后让其他线程执行同样的一段时间，时间到了之后，该线程挂起，又返回主线程开始执行，主线程再执行同样的一段时间，然后再挂起，跳到其他线程执行，如此不断循环，直到主线程完全执行完毕为止。<br><br>&nbsp; &nbsp;&nbsp;&nbsp;由此可见，要想让非主线程能够被完整执行，那么只要使它获得的时间片的总和大于或等于该线程连续执行完毕所需要的时间即可。基于此<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E5%8E%9F%E7%90%86">原理</span>，我们想到，只要让主线程被多次挂起即可使非主线程获得多个执行时间片。那么，如何让主线程多次被挂起呢？很简单，只要让主线程连续执行完毕所需要的时间是系统时间片的N倍即可，具体N等于多少合适，那需要视其他线程完整执行需要多少时间。我们实验一下，把调用Sleep（）那行代码注释起来，然后在那里写上如下代码：
<div class=blockcode>
<div id=code1>
<ol>
    <li>&nbsp;&nbsp;//Sleep（5）；<br>
    <li>&nbsp; &nbsp; for（int i=0；i&lt;1000000；i++）{}</li>
</ol>
</div>
<em onclick="copycode($('code1'));">复制代码</em></div>
这个for循环什么事也不做，就是延长主线程的执行时间，使主线程在一个时间片里执行不完，分成在若干个时间片里执行。运行程序，可以发现，输出的sum值等于6，符合预期，说明，线程1和线程2都得到了执行。<br><br>来源 Linux 联盟
<img src ="http://www.cppblog.com/fdsajhg/aggbug/123163.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fdsajhg/" target="_blank">傅先生</a> 2010-08-12 11:48 <a href="http://www.cppblog.com/fdsajhg/archive/2010/08/12/123163.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC多线程技术实现</title><link>http://www.cppblog.com/fdsajhg/archive/2010/08/12/123160.html</link><dc:creator>傅先生</dc:creator><author>傅先生</author><pubDate>Thu, 12 Aug 2010 03:34:00 GMT</pubDate><guid>http://www.cppblog.com/fdsajhg/archive/2010/08/12/123160.html</guid><wfw:comment>http://www.cppblog.com/fdsajhg/comments/123160.html</wfw:comment><comments>http://www.cppblog.com/fdsajhg/archive/2010/08/12/123160.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fdsajhg/comments/commentRss/123160.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fdsajhg/services/trackbacks/123160.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/fdsajhg/archive/2010/08/12/123160.html'>阅读全文</a><img src ="http://www.cppblog.com/fdsajhg/aggbug/123160.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fdsajhg/" target="_blank">傅先生</a> 2010-08-12 11:34 <a href="http://www.cppblog.com/fdsajhg/archive/2010/08/12/123160.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>