三九宝宝网宝宝百科宝宝知识

多线程到底如何执行

02月28日 编辑 39baobao.com

[“长跑令”难执行学生多抱怨“长跑”不容易]本报讯 我省暨兰州市第二届全国亿万学生阳光体育冬季长跑活动10月26日正式启动,根据省市教育部门要求,省内各学校将从10月27日起根据本校实际条件自行举行起跑仪式。执行“长...+阅读

形象点来说,就是这样。

比如说程序有两个线程,那么你就是手上有两个雪糕,

多线程执行的话就是,你左一口雪糕,右一口雪糕,轮着吃,

代码执行完了,你的雪糕吃完了,要是你的代码是带循环的,

你就会发现你的雪糕吃完又长出来了,要是死循环,就是怎么吃都吃不完= =

你只能一口一口吃雪糕,CPU也是这样,只能一段一段执行代码,

CPU的“时间片”概念就是这么个样子。

如果这两个线程优先级不一样呢,一个高一个低呢。

可以类比成你左边是个巧克力味,右边是个翔味的。

你当然更喜欢吃巧克力味的,就是左边两口,右边一口,当然你也可以换过来= =

如果你的CPU是双核的,你就可以理解你有两张嘴,当然两个头也是可以的= =

一般一个口会选一个雪糕来吃,一般不会出现中途吃一半又换过来的情况。

编写一个多线程的程序完成如下功能:

看看是不是符合你的要求。

#include

#include

#include

#include

int pid1,pid2;

main( )

{

int fd[2];

char outpipe[100],inpipe[100];

pipe(fd); /*创建一个管道*/

while ((pid1=fork( ))==-1);

if(pid1==0)

{

while((pid2=fork( ))==-1);

if(pid2==0)

{

sleep(1);

exit(0);

}

else

{

wait(0); /*同步*/

read(fd[0],inpipe,50); /*从管道中读长为50字节的串*/

printf("%s\n",inpipe);

wait(0);

exit(0);

}

}

else

{

lockf(fd[1],1,0);

sprintf(outpipe,"%d", getpid());

/*把串放入数组outpipe中*/

write(fd[1],outpipe,50); /*向管道写长为50字节的串*/

lockf(fd[1],0,0);

exit(0);

}

}

多线程编程怎么回事啊?

每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。

什么是多线程?

多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。线程是在同一时间需要完成多项任务的时候被实现的。

使用线程的好处有以下几点:

·使用线程可以把占据长时间的程序中的任务放到后台去处理

·用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度

·程序的运行速度可能加快

·在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。

还有其他很多使用多线程的好处,这里就不一一说明了。

一些线程模型的背景

我们可以重点讨论一下在Win32环境中常用的一些模型。

·单线程模型

在这种线程模型中,一个进程中只能有一个线程,剩下的进程必须等待当前的线程执行完。这种模型的缺点在于系统完成一个很小的任务都必须占用很长的时间。

·块线程模型(单线程多块模型STA)

这种模型里,一个程序里可能会包含多个执行的线程。在这里,每个线程被分为进程里一个单独的块。每个进程可以含有多个块,可以共享多个块中的数据。程序规定了每个块中线程的执行时间。所有的请求通过Windows消息队列进行串行化,这样保证了每个时刻只能访问一个块,因而只有一个单独的进程可以在某一个时刻得到执行。这种模型比单线程模型的好处在于,可以响应同一时刻的多个用户请求的任务而不只是单个用户请求。但它的性能还不是很好,因为它使用了串行化的线程模型,任务是一个接一个得到执行的。

·多线程块模型(自由线程块模型)

多线程块模型(MTA)在每个进程里只有一个块而不是多个块。这单个块控制着多个线程而不是单个线程。这里不需要消息队列,因为所有的线程都是相同的块的一个部分,并且可以共享。这样的程序比单线程模型和STA的执行速度都要块,因为降低了系统的负载,因而可以优化来减少系统idle的时间。这些应用程序一般比较复杂,因为程序员必须提供线程同步以保证线程不会并发的请求相同的资源,因而导致竞争情况的发生。这里有必要提供一个锁机制。但是这样也许会导致系统死锁的发生。

以下为关联文档:

线程间通信方式有哪些两个线程分别为生成消费如您好:AIDL(Android Interface Definition Language)是一种接口定义语言,编译器通过*.aidl文件的描述信息生成符合通信协议的Java代码,我们无需自己去写这段繁杂的代码,只需要在...

抢救病人如何执行医嘱1.保持镇静并立即将患者平卧。千万不要急着将病人送往医院,以免路途震荡,可将其头偏向一侧,以防痰液、呕吐物吸入气管。 2.迅速松解患者衣领和腰带,保持室内空气流通,天冷时注意...

执行力不够如何办履行力不敷怎么办吗起重要找到履行力不敷的原因才能找出解决的办法。假如你的计谋和目标和文化都是总裁计谋 和和总裁目标 和总裁文化 那么你就弗成能指望可以或许建立起企...

如何加强执行转载以下资料供参考 执行力可以理解为:有效利用资源,保质保量达成目标的能力。执行力指的是贯彻战略意图,完成预定目标的操作能力。是把企业战略、规划转化成为效益、成果的关...

执行力是什么?如何提高自己的执行执行力可以理解为:有效利用资源,保质保量达成目标的能力。执行力指的是贯彻战略意图,完成预定目标的操作能力。是把企业战略、规划转化成为效益、成果的关键。执行力包含完成任...

宝宝到底多大才能吃盐6个月之后,孩子开始添加辅食,从添加一些烂饭、烂面条、米粉等辅食开始,这个时候可以适当加“油”了。但是,这个油也是有所选择的,麻油、橄榄油 等植物油都是不错的选择,其中麻油不...

java如何判断一个线程结束线程结束时等待也就结束了 ------解决方案-------------------------------------------------------- waitforsingleobject当然可以。 或者设一全局变量,线程结束就将其置为...

Java如何判断线程池所有任务是否执行完毕import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Test { public static void main(String args[]) throws Interrupte...

执行程序中如何追加股东为被执行执行程序追加股东为被执行人并确定其责任要受到严格的限制执行人员通过调查查明公司股东具有出资瑕疵的情形,应当追加该股东为被执行人。 即使负有清算义务的股东不履行清算...

推荐阅读
图文推荐