- 1、本文档共31页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
4.1 为什么需要多进程/线程
还记得DOS时代有一个程序被大家奉为后台操作的经典,那就是Print.EXE(由M$提供),这个程序用于后台打印。可以从一定程度上实现了多任务,但是DOS并不是一个多任务的环境所以勉强实现多任务时限制太多。随后有了Windows 3.X,虽然OS有了多任务的支持但是严格的说来对多进程的支持并不够,这主要表现在进程间通信方面提供的支持非常少。一些传统的IPC方式都没有提供。后来在WinNT上完全实现了多进程/多线程支持,当然现在的Windows9X/2K都完全提供了这方面的支持。
什么是进程(Process):普通的解释就是,进程是程序的一次执行,而什么是线程(Thread),线程可以理解为进程中的执行的一段程序片段。在一个多任务环境中下面的概念可以帮助我们理解两者间的差别:
进程间是独立的,这表现在内存空间,上下文环境;线程运行在进程空间内。
一般来讲(不使用特殊技术)进程是无法突破进程边界存取其他进程内的存储空间;而线程由于处于进程空间内,所以同一进程所产生的线程共享同一内存空间。(图一)
同一进程中的两段代码不能够同时执行,除非引入线程。
线程是属于进程的,当进程退出时该进程所产生的线程都会被强制退出并清除。
线程占用的资源要少于进程所占用的资源。
进程和线程都可以有优先级。
在线程系统中进程也是一个线程。可以将进程理解为一个程序的第一个线程。
图一
一个最简单的例子就是在屏幕上画多个跳动的小球,我们对每个球的绘制都可以采用一个线程来完成。但是象这样的线程间完全独立没有影响没有数据交换的情况是很少的。
下面我们看一个例子,一个应用要完成两个任务:每次产生1000个随机数写入文件并从文件中读出数据并以该随机数为圆心画圆,对该操做进行100次,并使用100个不同的文件保存文件。传统做法如下:
void do_this(void)
{
for(int i=0;i100;i++)
{
/// step 1
generate 1000 randam number;
write to file;
/// step 2
read from file;
draw circle;
}
}
如果引入多进程的概念,则实现方法可以改为:
void do_this(void)
{
CreateProcess(do_rand.exe,...);
CreateProcess(draw_circle.exe,...);
}
//do_rand.exe
void do_rand(void)
{
for(int i=0;i100;i++)
{
/// step 1
generate 1000 randam number;
write to file;
wait draw_circle finish last task
tell draw_cricle data ready
}
}
//draw_circle.exe
void draw_circle(void)
{
for(int i=0;i100;i++)
{
/// step 2
set flag of last task finish
wait data ready
read from file;
draw circle;
}
}
在多进程中我们引入了更多的控制手段,首先do_rand在准备好数据后必须等待draw_circle处于空闲状态,这样做的原因是只有一个进程在进行画圆操作,所以必须保证当前提交的data ready请求能够被接收。在图二中我们可以看到用红框内的代码会在同时执行,由于使用了不同的文件(?从那里可以看出使用了不同的文件)所以不需要对文件的使用情况也进行判断。
图二
如果使用线程,我们可以进一步的改造程序,我们取消使用文件来保存数据,而是全局变量来保存数据:
void do_this(void)
{
CreateThread(do_rand...);//参数为线程入口而不是执行程序
CreateThread(draw_circle...);
}
global int giRandNum[1000];
void do_rand(void)
{
for(int i=0;i100;i++)
{
/// step 1
local int iRandNum[1000];
generate 1000 randam number;
get access of giRandNum;
memcpy(giRandNum,iRandNum,...);
release access of giRandNum;
wai
您可能关注的文档
最近下载
- 《复合材料的特性与应用》课件.ppt
- 妊娠晚期促子宫颈成熟与引产指南(2024)解读.pptx
- 保险异议处理拒绝处理ppt保险异议处理.ppt VIP
- 2025年内蒙古自治区中考数学试题卷(含答案解析).docx
- 湖南省永州市祁阳市2022-2023学年三年级下学期期末语文试题(pdf版无答案).docx VIP
- 设计和开发过程控制培训.pptx VIP
- 2019中国国内旅游发展年度报告_25页_4mb.pdf VIP
- 人教版三年级上册数学全册教学设计(配2025年秋新版教材).docx
- 安全风险分级管控和隐患排查治理双重预防机制培训课件.pptx VIP
- 各专业文件准备目录--内分泌科药物临床试验机构GCP SOP.doc VIP
文档评论(0)