问题一:
主线程里用函数CreateThread(NULL,0,ThreadProc,NULL,0,NULL)创建一个线程后是马上去执行ThreadProc还是要等待主线程的时间片到期后再去执行ThreadProc呢??
问题二:
比如我在主线程创建了2个线程,单核cpu是不是按照创建线程的顺序执行一个线程,然后等该线程时间片到期了再去执行另外一个线程?双核cpu是2个进程同时执行吗?还是像单核那样,按线程创建顺序依次执行??
1 线程切换是由系统调控线程队列的,没有特殊操作,会等主线程的时间片到期之后在切换到其他线程(不一定是马上执行新线程)。
2 单核的情况下基本上是这样,除非强制让线程(suspend)。双核或者多核的话,在不同processor上创建的线程可以同时执行,在同一processor上的线程队列管理跟单核类似。
系统中同时存在很多线程,有系统线程,也有自己进程和其它进程的线程,都是由系统统一调度,当某个线程获得CPU时间片后才会真正执行。程序在创建线程后,如果没有执行Sleep、Wait等函数主动放弃时间片,则该线程会继续执行,所以对于单核系统,可以说线程创建后不是立即开始执行的,对于多核系统,则有可能同一进程的多个线程在不同的处理器上同时执行。
对于问题1,子线程不会立即执行,主线程结束后也不一定是它,系统中还有很多线程,哪个线程被执行和优先级有关。
对于问题2,子线程的执行顺序不是创建的顺序,和优先级有关。多核系统可以同时运行多个线程。
不用琢磨是对的,因为线程切换的时间是纳秒级别的,在多核下更是会分配到不同的CPU下运行
1. 在同一逻辑执行单元当中的两个线程,不管多核还是单核,只要是这两个线程都在同一CPU执行逻辑资源当中,如果操作系统有时间片的概念,都会遵循时间片周期调度。
2. 关键看系统的调度机制,包括优先级,Susppend,甚至是Sleep等都可能影响调度顺利。CPU时间片的分配是以线程为基本单元的,跟进程没有必然的联系。如果是在自由模式,即系统自动调度的模式下,那么理论上来讲,系统会保证每个CPU逻辑执行单元(CPU核心)每一时间片都在执行线程代码,而线程可能是同一进程的多个不同线程,也可以是不同进程的多个线程,也可能是混合的,这个只跟线程的调度机制有关系。
总体来讲,线程的调度存在很多不确定性,但是可以通过一定的规则来改善这种不确定性,包括利用线程甚至是进程与CPU核心的绑定关系等等。而其中需要注意的一点是,对于多个同级线程,比如说处理同一业务队列当中的多个线程组成的线程池,最后一个完成执行过程的线程可能会具有更优的执行环境,包括其CPU时间片的分配和内存资源(跟内存管理逻辑有关系)。
我认为qiandayong说的并没有错,我们在写程序的过程中根本就没有CPU时间片这样的东西,我能所能操作的只是线程、进程、内存等
就像机器码或者汇编,难道一个高级语言程序员一定要完全了解它才能写出一个好的程序来么,如果一定要这么说,现在世界上的程序员比国宝还珍贵了,如果现在有哪个程序员能够控制CPU时间片,麻烦你拿一个你的程序出来,我来做测试员,看看你的程序比别人的程序强多少
一旦线程创建,我们就需要对其操作进行同步和保护,不管它是在单核还是多核还是多CPU环境下运行,除非我们有实实在在的需求并有必要针对多核或者多CPU做不同的处理,所以,对于通用程序来说,结论如qiandayong所说: "就认为都是并行就可以了"
如果不了解线程的调度,就不会知道如何会使得线程之间存在竞争。这跟不知道堆栈大小,可用内存有多少一样会存在问题。程序员如果不了解可用的系统资源,那么写出来的程序是非常可怕的。你甚至无法评估程序所须的最小运行环境。在很多时候实际的运行环境是非常苛刻的,而并非你想要什么的配置什么样的环境都能够一一为你提供。即便是能够为你提供相应的环境,你也同样需要有相应的报告。也许一个超深度的测试可以拿到一份相近的需求评估报告,但是这个超深度的测试代价也是相当大的,并且是在你的程序完全没有任何BUG的前提下做出来的,又有谁能够保证自己的程序没有BUG?
不错,线程之间存在竞争,但这种竞争的前提又是什么呢?是操作系统按照线程的优先级来调度,那是否我们把线程的优先级都设置highest就能够最大限度的使用CPU了吗?不是,这种最大限度的使用还是依赖于操作系统调度,因为我们对线程的操作行为不可能绕过OS,大部分情况下只有短线程在有特殊要求的的前提下才会提升线程优先级来运行,除非我们能够明确程序运行的目标环境,否则意义不大,甚至适得其反.尽管我们的程序在分发之前都会经过一定强度的测试,但是当部署到客户计算机上时,一百台计算机就可能出现一百种不同的问题,尤其是MS的系统,当然这并不能归咎于程序员的水平,就连OS本身都没办法做到这一点,又何况是在OS基础上开发出来的程序
这样的问题继续讨论下去的意义不大,程序员处在不同阶段,基于不同的出发点对程序的要求都是不一样的,写复杂算法或者频繁执行的过程时相比界面处理或者简单业务逻辑的处理,其要求肯定是不一样的,时下我们所能接触到的广泛使用的软件,从程序员的角度出发,又有几款是我们看得上眼的,但你不能说那不是高手的作品,只是其侧重点不一样,毕竟我们所处的是一个商业社会,并不是纯粹的学术研究,当然啦,国内那些所谓的学术研究甚至更不值一提了...
java中main为主线程,也可以增加线程。如果程序中有多个线程。
1、这些线程是怎样调用执行的呢?
2、几个线程顺序是怎样的,与什么有关?(我们可以通过方法设置线程的优先级,顺序和优先级有关吗?)
3、先运行谁,后运行谁?又取决于什么?
new Thread 然后 strat
下来就是看CPU执行时间 随机分配~~
你写个例子 打印输出 看下就知道了 多跑几次 结果都不一样
双核就是两个处理器,每个处理器单位时间内只能执行一个线程,但是多线程情况下,cpu调度的速度非常快,感觉就像同时执行多个线程一样。实际上是一次执行一个。而每个线程,不管你优先级有多高都是一种"抢占"的方式。不能确定cpu下一次一定执行哪一个线程。
线程是需要得到处理器分给的时间片才能执行的,
线程执行是没有确定顺序的,优先级及一些方法也只是改变执行的几率而已。
先运行谁、后运行谁没有确定的顺序。不同的环境(比如不同的操作系统)调度方式都不同,所以不能确定。
传统的单核cpu在一个时间点上只能运行一个线程,而双核理论上可以同时运行两个线程。
如果是双核CPU的话 那么就真正的实现了多线程。一般在JAVA里就是 new 一个Thread对象,然后start就可以开启这一线程了,至于执行的先后顺序,不确定,即便是设置了优先级也不能确定执行的顺序,优先级高的只能说被执行的几率比较大一点而已,所以宏观上看貌似优先级高的总是先被执行的。
线程的执行和顺序等问题是操作系统负责的,java不管。
四楼和三楼说的不一样,三楼说的是双核CPU在同一时间点也只能执行一个线程,只是时间很快。而四楼说在同一时间点可以执行两个线程。那什么说法正确呢?请高手解答!
单核处理器实际上采用了超线程技术,理论上就像多线程一样,并行运作,实际上,只是在一个CPU里面多加了一个逻辑处理单元,但是整数运算单元,浮点运算单元,二级缓存都是共享的,所以一旦两个线程遇到一个资源的时候就必须停止其中一个,等待另外一个执行完才可以继续执行。也就是说单核CPU没有做到资源的共享。
但是双核处理器就不一样了,每个核心都有自己独立的指令集,执行单元,所以实实在在的实现了两个线程并行工作。举个例子吧,单核CPU就像一个人有一个大脑两个小脑,而双核CPU就是一个人有两个大脑
一个CPU同一时间点只能执行一个线程。
由于有两个CPU,故可同时执行两个线程。具体的调度是OS设定的可以保证程序的正常。