单核双核多线程的简单问题..

NesTa_xP 2009-01-13 01:03:05
问题一:
主线程里用函数CreateThread(NULL,0,ThreadProc,NULL,0,NULL)创建一个线程后是马上去执行ThreadProc还是要等待主线程的时间片到期后再去执行ThreadProc呢??
问题二:
比如我在主线程创建了2个线程,单核cpu是不是按照创建线程的顺序执行一个线程,然后等该线程时间片到期了再去执行另外一个线程?双核cpu是2个进程同时执行吗?还是像单核那样,按线程创建顺序依次执行??
...全文
1366 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
alex_uestc 2009-11-17
  • 打赏
  • 举报
回复
哈哈11111111
woyaowenzi 2009-02-23
  • 打赏
  • 举报
回复
不错。收藏了
winmenaruto 2009-02-12
  • 打赏
  • 举报
回复
12楼 ,5楼说的好
僵哥 2009-01-16
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 Sky_huang 的回复:]
我认为qiandayong说的并没有错,我们在写程序的过程中根本就没有CPU时间片这样的东西,我能所能操作的只是线程、进程、内存等
就像机器码或者汇编,难道一个高级语言程序员一定要完全了解它才能写出一个好的程序来么,如果一定要这么说,现在世界上的程序员比国宝还珍贵了,如果现在有哪个程序员能够控制CPU时间片,麻烦你拿一个你的程序出来,我来做测试员,看看你的程序比别人的程序强多少
一旦线程创建,我们就需要对其操作进行同步和保护,不管它是在单核还是多核还是多CPU环境下运行,除非我们有实实在在的需求并有必要针对多核或者多CPU做不同的处理,所以,对于通用程序来说,结论如qiandayong所说: "就认为都是并行就可以了"[/Quote]
如果不了解线程的调度,就不会知道如何会使得线程之间存在竞争。这跟不知道堆栈大小,可用内存有多少一样会存在问题。程序员如果不了解可用的系统资源,那么写出来的程序是非常可怕的。你甚至无法评估程序所须的最小运行环境。在很多时候实际的运行环境是非常苛刻的,而并非你想要什么的配置什么样的环境都能够一一为你提供。即便是能够为你提供相应的环境,你也同样需要有相应的报告。也许一个超深度的测试可以拿到一份相近的需求评估报告,但是这个超深度的测试代价也是相当大的,并且是在你的程序完全没有任何BUG的前提下做出来的,又有谁能够保证自己的程序没有BUG?
Sky_huang 2009-01-16
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 unsigned 的回复:]
引用 4 楼 pomelowu 的回复:
引用 2 楼 qiandayong 的回复:
不用琢磨时间片,就认为都是并行就可以了

作为一个程序员,我觉得用不着考虑这些事


时间片这种东西,如果不是程序员来琢磨,应该让谁来琢磨呢?

他的意思是不是Coder该琢磨的。

如果一个程序员连在什么条件下自己的代码会被执行,那还做什么程序员?
[/Quote]

我认为qiandayong说的并没有错,我们在写程序的过程中根本就没有CPU时间片这样的东西,我能所能操作的只是线程、进程、内存等
就像机器码或者汇编,难道一个高级语言程序员一定要完全了解它才能写出一个好的程序来么,如果一定要这么说,现在世界上的程序员比国宝还珍贵了,如果现在有哪个程序员能够控制CPU时间片,麻烦你拿一个你的程序出来,我来做测试员,看看你的程序比别人的程序强多少
一旦线程创建,我们就需要对其操作进行同步和保护,不管它是在单核还是多核还是多CPU环境下运行,除非我们有实实在在的需求并有必要针对多核或者多CPU做不同的处理,所以,对于通用程序来说,结论如qiandayong所说: "就认为都是并行就可以了"
野男孩 2009-01-16
  • 打赏
  • 举报
回复
处理器的最小调度单位是线程,跟线程是哪个进程的无关。

<windows internals>第四版中的原文:

As already noted, Windows schedules at the thread granularity. This approach makes sense when you consider that processes don't run but only provide resources and a context in which their threads run. Because scheduling decisions are made strictly on a thread basis, no consideration is given to what process the thread belongs to. For example, if process A has 10 runnable threads, process B has 2 runnable threads, and all 12 threads are at the same priority, each thread would theoretically receive one-twelfth of the CPU time—Windows wouldn't give 50 percent of the CPU to process A and 50 percent to process B.
chxy85 2009-01-16
  • 打赏
  • 举报
回复
获益匪浅
roadblossom 2009-01-16
  • 打赏
  • 举报
回复
up
Sky_huang 2009-01-16
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 unsigned 的回复:]
如果不了解线程的调度,就不会知道如何会使得线程之间存在竞争。这跟不知道堆栈大小,可用内存有多少一样会存在问题。程序员如果不了解可用的系统资源,那么写出来的程序是非常可怕的。你甚至无法评估程序所须的最小运行环境。在很多时候实际的运行环境是非常苛刻的,而并非你想要什么的配置什么样的环境都能够一一为你提供。即便是能够为你提供相应的环境,你也同样需要有相应的报告。也许一个超深度的测试可以拿到一份相近的需求评估报告,但是这个超深度的测试代价也是相当大的,并且是在你的程序完全没有任何BUG的前提下做出来的,又有谁能够保证自己的程序没有BUG?
[/Quote]
不错,线程之间存在竞争,但这种竞争的前提又是什么呢?是操作系统按照线程的优先级来调度,那是否我们把线程的优先级都设置highest就能够最大限度的使用CPU了吗?不是,这种最大限度的使用还是依赖于操作系统调度,因为我们对线程的操作行为不可能绕过OS,大部分情况下只有短线程在有特殊要求的的前提下才会提升线程优先级来运行,除非我们能够明确程序运行的目标环境,否则意义不大,甚至适得其反.尽管我们的程序在分发之前都会经过一定强度的测试,但是当部署到客户计算机上时,一百台计算机就可能出现一百种不同的问题,尤其是MS的系统,当然这并不能归咎于程序员的水平,就连OS本身都没办法做到这一点,又何况是在OS基础上开发出来的程序
这样的问题继续讨论下去的意义不大,程序员处在不同阶段,基于不同的出发点对程序的要求都是不一样的,写复杂算法或者频繁执行的过程时相比界面处理或者简单业务逻辑的处理,其要求肯定是不一样的,时下我们所能接触到的广泛使用的软件,从程序员的角度出发,又有几款是我们看得上眼的,但你不能说那不是高手的作品,只是其侧重点不一样,毕竟我们所处的是一个商业社会,并不是纯粹的学术研究,当然啦,国内那些所谓的学术研究甚至更不值一提了...
僵哥 2009-01-16
  • 打赏
  • 举报
回复
当然,Coder有很多个级别,不过我相信,本贴的读者99%所在的单位的分级还不会达到有一个最底层的Coder就象写脚本那样只管代码填充而不需要去更多的关心运行环境,相反更多的人是从最初的项目立项到设计到编码一条龙都要参与。
僵哥 2009-01-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 NesTa_xP 的帖子:]
问题一:
主线程里用函数CreateThread(NULL,0,ThreadProc,NULL,0,NULL)创建一个线程后是马上去执行ThreadProc还是要等待主线程的时间片到期后再去执行ThreadProc呢??
问题二:
比如我在主线程创建了2个线程,单核cpu是不是按照创建线程的顺序执行一个线程,然后等该线程时间片到期了再去执行另外一个线程?双核cpu是2个进程同时执行吗?还是像单核那样,按线程创建顺序依次执行??
[/Quote]
1. 在同一逻辑执行单元当中的两个线程,不管多核还是单核,只要是这两个线程都在同一CPU执行逻辑资源当中,如果操作系统有时间片的概念,都会遵循时间片周期调度。
2. 关键看系统的调度机制,包括优先级,Susppend,甚至是Sleep等都可能影响调度顺利。CPU时间片的分配是以线程为基本单元的,跟进程没有必然的联系。如果是在自由模式,即系统自动调度的模式下,那么理论上来讲,系统会保证每个CPU逻辑执行单元(CPU核心)每一时间片都在执行线程代码,而线程可能是同一进程的多个不同线程,也可以是不同进程的多个线程,也可能是混合的,这个只跟线程的调度机制有关系。

总体来讲,线程的调度存在很多不确定性,但是可以通过一定的规则来改善这种不确定性,包括利用线程甚至是进程与CPU核心的绑定关系等等。而其中需要注意的一点是,对于多个同级线程,比如说处理同一业务队列当中的多个线程组成的线程池,最后一个完成执行过程的线程可能会具有更优的执行环境,包括其CPU时间片的分配和内存资源(跟内存管理逻辑有关系)。
僵哥 2009-01-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pomelowu 的回复:]
引用 2 楼 qiandayong 的回复:
不用琢磨时间片,就认为都是并行就可以了

作为一个程序员,我觉得用不着考虑这些事


时间片这种东西,如果不是程序员来琢磨,应该让谁来琢磨呢?
[/Quote]
他的意思是不是Coder该琢磨的。

如果一个程序员连在什么条件下自己的代码会被执行,那还做什么程序员?
sad_4978 2009-01-15
  • 打赏
  • 举报
回复
目前看,单核CPU还是多核CPU如果调度是操作系统的问题,程序员目前好像还控制不了。

我曾经查一些资料,目前的Windows操作系统对多个CPU支持的很好比如:CPU的利用率,线程控制都要比 多核CPU强很多。
好像是目前Windows操作系统还没有针对多核CPU做处理。

但是如果使用因特的编译器,估计会好一些。

具体的还需要调查一下,呵呵。
red-fly 2009-01-14
  • 打赏
  • 举报
回复
两位大虾说得不统一:
1(pomelowu). 在不同processor上创建的线程可以同时执行,在同一processor上的线程队列管理跟单核类似。
2(cnzdgs). 对于多核系统,则有可能同一进程的多个线程在不同的处理器上同时执行。

如何证明谁对谁非?
bluesen 2009-01-14
  • 打赏
  • 举报
回复
不用琢磨是对的,因为线程切换的时间是纳秒级别的,在多核下更是会分配到不同的CPU下运行。
冰霜icefrost 2009-01-14
  • 打赏
  • 举报
回复
建议LZ了解一下OpenMP,用于多核开发的一个应用编程接口。
csgdseed 2009-01-14
  • 打赏
  • 举报
回复
利用多核好像要专门做代码优化的
echoher 2009-01-14
  • 打赏
  • 举报
回复
对于问题1,子线程不会立即执行,主线程结束后也不一定是它,系统中还有很多线程,哪个线程被执行和优先级有关。
对于问题2,子线程的执行顺序不是创建的顺序,和优先级有关。多核系统可以同时运行多个线程。
pomelowu 2009-01-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qiandayong 的回复:]
不用琢磨时间片,就认为都是并行就可以了

作为一个程序员,我觉得用不着考虑这些事
[/Quote]

时间片这种东西,如果不是程序员来琢磨,应该让谁来琢磨呢?
cnzdgs 2009-01-13
  • 打赏
  • 举报
回复
系统中同时存在很多线程,有系统线程,也有自己进程和其它进程的线程,都是由系统统一调度,当某个线程获得CPU时间片后才会真正执行。程序在创建线程后,如果没有执行Sleep、Wait等函数主动放弃时间片,则该线程会继续执行,所以对于单核系统,可以说线程创建后不是立即开始执行的,对于多核系统,则有可能同一进程的多个线程在不同的处理器上同时执行。
加载更多回复(2)

15,476

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧