我比较擅长使用VB,所以此题目就发到VB区了
这个题目是讨论多线程,或许和VB无关,但是由VB引起的...问题是这样:
windows 对多线程是怎么管理的?
是排成队列平均分配时间,依次执行;还是随机执行???对以下 1 和 2两个观点哪个更贴近本质一点?
1.多线程只不过是多占用CPU,浪费资源的做法,速度根本提不高
2.第2个言论如下:
1  2  3   4   5   6  前面6个数字代表6个程序(单线程),无论哪个线程占用了100%CPU时间,系统都还要继续执行另外的5个,并不是只执行那1个了; windows 多线程编程的含义就是抢占资源,让程序以高效率完成任务,假如你的程序是多线程(比如说是2个线程,那么一共是7个线程了),那么CPU要花 2/7 的时钟周期来做你的任务,别的只做1/7,可以这样说,线程越多执行速度越快,因为你更多的利用(占用)了CPU时间这样说来,如果你的程序有5个线程,系统中总线程数达到 10 个,那么将会有 1半的CPU时钟周期被你使用这就是多线程带来的好处;这种多线程的方式在windows这样的非标准多线程系统中,优势显得尤为突出 以上两个言论,请大家评价一下,哪个更贴近windows多线程运行方式的本质
第 2 个言论多少有点过激,但反应的是一个方式;请大家多多给点意见

解决方案 »

  1.   

    多线程的好处是灵活性,提高CPU利用率,而不是提高效率
    纯CPU运算程序分成多个线程,当然会降低效率无疑
      

  2.   

    多线程适用的场合例如:
    比较耗时的任务,另外开一个线程,容易控制,不影响主界面的响应
    等待慢速操作(与硬件、网络交互),导致CPU长时间闲置,用多线程可以并行多个任务,N个任务
    都在等待的概率降为原来的N分之一,多个任务在等待时,总有一个在运行,提高了CPU利用率
      

  3.   

    开过多的线程会导致混乱,大量CPU时间浪费在线程切换上
      

  4.   

    >viena(维也纳nn) 
    什么程序不是靠CPU运算而完成任务的???>提高效率
    提高效率是对程序说,提高程序效率不就是提高了对CPU的利用率吗
      

  5.   

    > viena(维也纳nn) :开过多的线程会导致混乱,大量CPU时间浪费在线程切换上
    你认为CPU总是在计算一个线程吗??
    你不认为CPU总是在切换线程吗???好好查查资料,对你会有所帮助
    每个线程CPU大概只会计算20ms的代码段
      

  6.   

    找了一个给你:
    去看看吧,这是一个项目,这个项目中用了多线程,而且对多线程的一些特性和windows怎么利用
    CPU执行多线程的,有一个简单的介绍:http://www.wanfangdata.com.cn/qikan/periodical.Articles/dyjs/dyjs99/dyjs9904/990414.htm
      

  7.   

    楼上高手,我说的话也许没水准,但我是研究技术来了...
    觉得我语文不好,就忍下吧,把问题解决了才是好嘛...你的回贴我看了又看....还是觉得我的回贴正好符合你的理论另外很想知道你的确切看法,而不是一篇长论;能告诉我,如果题目是选择题
    你选哪个吗??? 还有:windows 对多线程是怎么管理的?
    是排成队列平均分配时间,依次执行;还是随机执行???这个你的解释是什么?
      

  8.   

    你们两个傻逼,会不会,操你们吗的!!!
    你们丫挺的分都是灌出来的吧,操你吗的!!!aspower_(csdn三星菜鸟!我就上星了,不服你咬我啊!)
    麻痹的会不会,不会给爷爷滚蛋!!孙子!!!
      

  9.   


        一个进程通常定义为程序的一个实例。在Win32中, 进程占据4GB的地址空间。与它们在MS-DOS和16位Windows操作系统中不同, Win32进程是没有活力的。这就是说,一个Win32进程并不执行什么指令,它只是占据着4GB的地址空间,此空间中有应用程序EXE文件的 代码和数据。EXE需要的任意DLL也将它们的代码和数据装入到进程的地址空间。除了地址空间,进程还占有某些资源,比如文件、动态内存分配和线程。当进程终止时,在它生命期中创建的各种资源将被清除。  但是进程是没有活力的,它只是一个静态的概念。为了让进程完成一些工作,进程必须至少占有一个线程,所以线程是描述进程内的执行,正是线程负责执行包含在进程的地址空间中的代码。实际上,单个进程可以包含几个线程, 它们可以同时执行进程的地址空间中的代码。为了做到这一点,每个线程有自己的一组CPU寄存器和堆栈。  每个进程至少有一个线程在执行其地址空间中的代码,如果没有线程执行进程 地址空间中的代码, 进程也就没有继续存在的理由,系统将自动清除进程及其地址空间。为了运行所有这些线程,操作系统为每个独立线程安排一些CPU 时间,操作系统以轮转方式向线程提供时间片,这就给人一种假象,好象这些线程都在同时运行。创建一个Win32进程时,它的第一个线程称为主线程,它 由系统自动生成,然后可由这个主线程生成额外的线程,这些线程,又可生成更多的线程。
      

  10.   

    viena(维也纳nn) 说的很详细了。
    楼主你可以无知,可以弱智, 这都不能怪你。
    但你素质底下就是你不对了。
      

  11.   

    windows 对多线程是怎么管理的?
    是排成队列平均分配时间,依次执行;还是随机执行???不是顺序执行, 也不是随机执行,
    windows 是抢占试多任务操作系统, 他有一个时间片的概念。
    当时间片轮转一次时, 就会导致线程切换,
    系统从优先级高的线程序中优先顺序找到一个“等待”状态的线程来执行。
    你不要担心优先级最低的线程永远不会被执行, 这是系统会考虑的事。
    对以下 1 和 2两个观点哪个更贴近本质一点?
    1.多线程只不过是多占用CPU,浪费资源的做法,速度根本提不高
    2.第2个言论如下:===============================
    首先, cpu只有一个, 在多个线程中执行代码, 无非是快速的切换到多个线程中执行。
    线程切换的代价是很高的。
    比如你开2个线程, 同时计算pai的1W位, 和你开一个线程连续的执行2次计算,
    这个时候, cpu始终是满负荷运转。
    你会发现 一个线程计算2次的速度要快些, 一没有了线程上下文切换的代价。再给个例子, 如果你把c盘的东西拷到d盘, 同时又想把e盘的东西拷到f盘,
    你是一个一个拷快, 还是同时拷快?
    如果你同时拷, 那么硬盘的磁头不停的在c,d,e,f切换。
    如果一个一个的拷, 那么硬盘的磁头只是在c,d切换。 然后在e,f切换。
    假如同时拷贝的时间和一个接一个拷的时间相等, 并且c到d 和 e到f 的时间相等。
    你计算下切换次数, 就知道2者相差多大。 用实验也很容易证明。
    当然你数学没学好可能算不出来。
    这都是因为cpu本来就是满负荷运算, 所以就不要用多线程。看另一个例子,为什么ftp要用多线程下载, 为什么讯雷等p2p工具下载巨快?
    说ftp吧。
    在一个tcp连接中, 发送“请求位置0,数据长度1000”和接收“数据”站用的cpu时间很短, 线程都一直处于
    “组塞”状态, 在这个状态的线程是不会执行的, 直到网上有数据慢慢的通过网络到达
    你电脑的时候, 才会唤星你的线程, 继续执行。
    为什么不在网上有数据慢慢传过来的时候, 另外在发送一个“请求位置1000,数据长度1000”
    的包? 
    当cpu不满附和运转中, 并且可以在cpu等待的过程中做一些其他的事, 这个时候用多线程
    可以大大提高速度。  实际上, 也同时 提高CPU利用率如果你的程序在参与一个大运算, 如果你的程序在等待串口事件, 在等待网罗数据,
    这时如果你只有一个线程, 那么你的界面怎么能响应? 用户点最大化什么的发现没反应。
    是不是以为你程序坏了? 你这时候就可以把这些操作新建一个线程执行罗嗦说了这么多, 如果lz还是看不懂。 就回去补习小学语文。 
      

  12.   

    1观点是无稽之谈,多线程是为了灵活控制多任务执行,而不是提高运行速度2观点恰恰弄反了
    提高CPU利用率,是尽量利用CPU的空闲时间,而不是去抢CPU时间
    一般认为CPU占用率很高的程序是垃圾程序
      

  13.   

    楼主,之所以不回答你因为没法回答
    张口就骂人,就是你的不对了,就这素质,唉~//另外很想知道你的确切看法,而不是一篇长论;能告诉我,如果题目是选择题
    //你选哪个吗??? 还有:
    我认为两个都不对,我为什么要选一个呢?//windows 对多线程是怎么管理的?
    //是排成队列平均分配时间,依次执行;还是随机执行???
    这个不是几句话能说清楚的,而且也不得不承认,我没研究过Windows系统
    上大学的时候学操作系统是用的Unix的例子
    但我知道,你的两个备选答案同样是两个都不是
      

  14.   

    本来写了好多,想和你们好好的辩论一下,但有些人的回复貌似根本没有看清问题所在我提出来的问题中那些选项,是经过 N 个计算机专业本.研..毕业的..
    工作了 N 年,开发过 N*N 的项目了...的人, 讨论过的!就算是CPU满符合计算,1个线程就可以避免线程切换吗?
    开多线程是为了让程序有更多的时间执行某个代码举个多任务的例子:
    应该这样想;一个孩子,在做作业的同时也在玩游戏,(两个任务)但它把这两件事情分成多个小事情,比如总数为 10
    10 分钟内,小孩子要玩游戏,要做作业;轮番进行,1分钟进行一次玩和做;每个 1 次各 5 次 ; 但你发出指令做作业要优先完成,在总时间不变的情况下你可以添加做作业的要求,那么系统就要从新计算10分钟内小孩子做多少次作业,玩多少次游戏,你发出多做25次的作业的要求,那么10分钟内小孩子要做30次作业,玩10次游戏,假设这 40次时间都是均等的;10分钟内一共是40次的时间,每次的时间基本就是10/40=0.25(每次做作业或者玩游戏的时间25秒一换);
    总的做作业时间就是 0.25 * 30 = 7.5 分钟
    再来看以前,10分钟内10次,做作业和做游戏各 5 次 10 / 10 = 1(1分钟转换一次做的东西); 
    总的作业时间是 1 * 5= 5 分钟这下很明显; 虽然更多次的切换小孩子做作业和游戏的次数,
    但更多的做作业次数带来更多的作业时间看看吧,有意见再说吧线程切换代价就算再高,系统也会在20ms左右的时间后切换,这是谁也阻止不了的
    就算你的程序100%占用CPU,系统也只给你20ms的CPU时间执行你的代码如果你增加 1 线程,继续上一个线程的代码,那你就可以获得相当于40ms的代码执行时间
    这点道理........
     
      

  15.   

    //开多线程是为了让程序有更多的时间执行某个代码CPU一般只有一个,它的能力是有限的,它要兼顾所有的程序
    而不是只为你的程序服务,你抢占的时间多,其他就少
    “开多线程是为了让程序有更多的时间执行某个代码”
    这句话某种程度上是对的,但你的指导思想反了我再重复一遍:
    提高CPU利用率,应该是尽量利用CPU的空闲时间,而不是去抢CPU时间
    恰恰相反,耗时的任务要让出时间让不耗时的先运行,而不是去抢
    等到CPU空闲的时候,再来执行耗时的任务
    举个例子:
    假设你解压缩一个文件,需要1分钟,你还有个钟表程序,你想看一下时间,这个需要1秒钟,解压任务应该让钟表程序先运行;这样,1秒后就看到了时间,1分零1秒后,文件解压完毕;
    如果压缩任务去抢CPU时间,使得钟表程序只有原来的五分之一运行时间,那最后文件解压并没有更快完成,而你等了5秒钟才看到时间。你不认为这样的解压程序是垃圾吗?
      

  16.   

    如果是多人用一个系统(比如以前一个小型机连多个终端),抢占还有点可能,但也是不道德的做法;问题是Windows是PC(个人机)上的操作系统,所有程序都是你自己的程序;你用一个耗时的任务去抢占别的程序的时间简直是搬起石头砸自己的脚,太荒唐可笑了~
      

  17.   

    如果你的任务就是很重要,比系统任务和其他所有任务都重要
    只要提高进程优先级,就可以抢占所有CPU时间直到运行结束
    完全没有必要用多线程来抢时间,多线程不是作这个用的~
      

  18.   

    你们抓不住问题的重点,给我胡拽这 P...
    那P...
    有毛病,还有就是爱吃猪肉的那个2,愣头愣脑,瞎缠呼
    我有涉及到线程优先级的问题吗?>>
    如果是多人用一个系统(比如以前一个小型机连多个终端),抢占还有点可能,但也是不道德的做法;问题是Windows是PC(个人机)上的操作系统,所有程序都是你自己的程序;你用一个耗时的任务去抢占别的程序的时间简直是搬起石头砸自己的脚,太荒唐可笑了~
    --------------------------
    我只是说多线程的本质;或者说是多线程实现起来的原理
    并不一定是个程序都来个多线程
    那你一边看网页一边用flashget下载是砸自己脚,你承认吗?你们连最起码的 进程  和  线程的 概念都不动,还跟我说什么??
    搬一大堆,没用的话跟我理论??我真是服了你们了,特别是那些产卵的
    如果你们能多少用点词来描述一下也行;说我没逻辑?
    说我没逻辑的人,你自己好好看看我的题目;好好看看什么叫进程;什么叫线程!
    别丈着会写几句VB代码就觉得自己很了不起好吗?
    学学什么是C,windows的实现原理,工作机制!!!
    学学!!!!再来教别人!!!
      

  19.   

    别丈着会写几句VB代码就觉得自己很了不起好吗?
    学学什么是C,windows的实现原理,工作机制!!!
    学学!!!!再来教别人!!!
    -----------------------------------------------------------------
    请楼主教教大家
      

  20.   

    //那你一边看网页一边用flashget下载是砸自己脚,你承认吗?
    你认为flashget是靠多线程来抢CPU时间吗?你用flashget开很多线程下载的时候,看一下其CPU占用是否很高?是否影响你其他正常操作?相反你自己写一个开很多个线程的纯CPU运算(比如死循环)的程序,看一下什么效果,再与我的话印证一下就知道了~声明:上面的话,不是对楼主说的,只希望其他看帖的人不要被楼主误导
      

  21.   

    仍然是对除楼主以外的人说:可以试一下,多线程下载,保持正常优先级,
    开30个线程,假设网速不慢,看看CPU使用率是不是会变成100%
      

  22.   

    两派都说的是对的,不过都走了极端!1:楼主是想讨论,多线程是否能够提高他自己的程序的执行效率!
       答案是肯定的,不过这样做的肯定要牺牲cpu的切换时间,而且要损失其它进程中的线程的执行效率。因此一般来讲不会这么干的。2:其它几位达人是从,系统cpu的效率来考虑的,从系统的角度来讲,楼主的多线程属于抢占系统资源,这样做并没有提高整个系统的效率,反而会影响系统的效率,但是这里有个前提:就是当前cpu没有任何的空余时间片。至于,帖子中双方的举例,其实多线程的初衷就是为了解决,在cpu存在大量的空余时间片的时候,用多线程来使用这些时间片,不至于被浪费掉!!因为,双方是站在不同的立场来分析多线程,答案肯定是不能统一的!!!
    看来大家是因为沟通有问题哦!!
      

  23.   

    呃,额,为啥我又看到多线程的吵架贴了,俺垃圾就不掺和了免得
    多线程只是为了在一个进程里面实现多个对于CPU资源来说“异步”的任务而已,而关于效率的问题,其实可以忽略不计的,首先目前的CPU处理能力,任何时候都有可操作的时间,Windows内部的控制也是很好的,不然Windows发展那么多年可以说是废了PS:此帖在VBGOOD有点讨论的意义,但在CSDN就算了
      

  24.   

    今二次览本帖,刚看明白,那是N年前的老帖呀.都过去了,想必当事人对此问题的看法也有了新的看法.
    建议LZ把老帖结了.
      

  25.   

    讨论讨论也无妨对于06年时我的认识,从现在来评判的话,似乎差距也不是很大只是明确了 win32在线程调度上的规则有些朋友可能误会了我当时对这个帖子讨论的论点,其实我只是想单纯的讨论下多线程的优势并没有说应用上到底有怎样的差距,当时讨论的基础是单核cpu,其实就算是现在的多核情况下,差别也不是很大
    在别处讨论多线程的问题时,我这样给别人说过我对多线程的认识:
      

  26.   

    我的I3CPU是四线程的,用activexexe多线程挺好的:)
      

  27.   

    《Windows核心编程》
    《深入解析Windows操作系统-Windows Internals》