- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Windows环境下的多线程编程.doc
Windows环境下的多线程编程浅讲
这是一个简单的关于多线程编程的指南,任何初学者都能在这里找到关于编写简单多线程程序的方法。如果需要更多的关于这方面的知识可以参考MSDN或本文最后列出的参考文献。本文将以C语言作为编程语言,在Lcc-Win32编译器下进行编译调试,使用MS-Visual Studio的人可以参考其相关的使用手册。没有C语言基础的朋友可以找一本简单的教程看一下,相信会是有帮助的。
首先解释什么是线程,谈到这个就不得不说一下什么是进程,这是两个相关的概念。为了方便理解,我推荐大家下载并使用一下flashget(网际快车)这个下载软件,当然迅雷也行,只是不如flashget这么直观了。O.K.言归正传,当我们打开flashget这个软件时,就是启动了一个进程。这个进程就指flashget这个软件的运行状态。当我们用它来下载时都是在整个flashget软件里操作,所以可以把单个进程看作整个程序的最外层。然后我们可以看到,在用flashget下载时可以选择同时使用多少线程来下载的选项(这里介绍个小技巧,用超级兔子可以优化这里的选项,将最大的线程数限制从10改为30),这个选项就包含了我所要讲的线程的概念。当同时用比如5根线程来下载的话,flashget就会同时使用5个独立的下载程序来下载文件(各个线程通过某种方式通信,以确定各自所要下载的部分,关于线程间的通信在后面介绍)。所以线程可以看作是在进程框架下独立运行的与进程功能相关的程序。如果将windows看作进程的话,那么里面跑得QQ啊,MSN什么的都可以看作是windows的线程了。当然进程本身也可以看作是线程,只是凌驾于其它线程之上的线程罢了。另外比如我们使用浩方对战平台来网上对战,当用浩方启动魔兽时,由于运行的是两个不同的程序,那就是多进程编程了,这要比多线程复杂点,但也是复杂的有限,有兴趣的人可以参考MSDN上的相关资料。
最后声明一下,文中的例子都没有过多的注释,不过我都使用了最简单的例子(至少我个人已经想不出更简单的了),如果读者对理解这里的程序上有困难,那么我的建议是这篇文章已经不适合你了,你应该看一些更基础的书,比如《小学生基础算数》^_^。
为了使对多线程编程有个更感性的认识,这里先给出一个简单的多线程程序。(注:这是一个利用标准C99函数实现的初级多线程实例,由于兼容性的问题可能在MS-Visual Studio下无法编译通过,遇到这个问题人可以跳过这个实例的实际运作方式或者改用Lcc-Win32)
//***********一个简单的多线程程序****************
#include stdheaders.h
void thread (void *p)
{
while(1){
//这里可以加入一些你所希望线程执行的程序,比如:
//puts(This chick turns me on.);
//break;
}
endthread();
}
int main(void)
{
int b=0;
for(int i=0;i30;i++){
printf(begin thread%d\n,b++);
beginthread(thread,0,NULL);
}
while(1);
return 1;
}
//***********************************************
代码的一开始是先指明所要用到的头文件,stdheaders.h是Lcc-Win32专门制作的包含了所有符合C99标准的库函数的头文件。这一点在后面不再指出,使用MS-Visual Studio的人可以自行添入stdio.h等标准头文件。接着是一个子程序,这个就是一般的线程程序,在C语言中把它作为一个子程序单独写出。再后面就是main函数,它起的作用就好比整个程序的外框架,具体要做什么则有线程来处理。可以看到在main函数和线程函数中都有无限的循环,这是因为:如果mian函数执行完了,那么无论线程函数处于一个怎样的状态整个程序都会退出,而如果线程中没有无限循环,那么线程的自动结束并不会影响到main函数,是否要结束main函数可以根据实际需要。在main函数中有一个beginthread()函数,这个就是专门用来启动线程的函数,可以看到这个函数的第一个参数就是需要启动的线程的函数地址,不过本文是讨论如何在windows下实现多线程编程,就不对这个函数进行介绍了,而把更多的精力放到对后面windowsAPI(从C语言的观点来开,就是函数)的介绍上,并且beginthread()这个函数过于轻量级,在略微复杂一点的场合下就不能满足要求了。如果执行这个程序并把//符号去掉的话,可以发现屏幕的输出毫无章法,这是由于操作系统
文档评论(0)