CPU的运算是分时间片的,理论上讲,CPU没有真正意义上的并发
多线程,通俗的讲就是几个线程轮换时间片执行
比如线程A B C并发,S是CPU的时间片,那么A执行S时间(此时A可能并未完成运算),挂起,执行B S时间,B挂起,执行C,C挂起,再执行A

解决方案 »

  1.   

    那这个辅助线程不是还要等我主线程挂起的时候他才能执行,或者等我设置了(set)了信号量他才可以执行的吗?
    前半句是的,后半句有问题,信号量的设置是在线程准备运行前的一种条件配置,线程运行过程中,信号量是根据信号量的物理意义自动调整的。
    那这个时候如果主线程一直在执行,这个辅助线程不是一直挂起吗?
    当然,这是对于单cpu的情形,一个处理器处理的指令都是在排队过程中的,多线程只是我们感觉的多线程,对于某一个cpu他同一时间只会去处理一条指令;多cpu多线程代码写的合适可以达到真正的多线程效果。
    那怎么能起到计算的作用呢,还不是要等我主线程执行完毕才释放信号量后他才可以继续执行吗?
    是啊,信号量就是在协调线程间的关系。
    怎么感觉这样还是顺序执行,而不是真正的同步嘛。
    单cpu没有真正的多线程
      

  2.   

    我不是牛人,但是我进来了。两颗 CPU,一颗在跑主线程。同时另外一个在跑辅助线程。至于你所说的 set 问题, 你是手动干预了线程,是你命令它不要并行计算的,线程当然服从你的命令了。
      

  3.   

    你这个问题不用牛人也能答出来,呵呵。在线程A中启动一个线程B。(你可以把A看作主线程)
    从微观上看,两个线程都会得到CPU的时间片,所以两个是交替执行的。也就是你说的顺序执行吧。
    从宏观上看A、B是同时执行的。并不是顺序执行。
    另外你说的信号什么的是在两个线程需要同步的时候才需要的。如果不需要同步的话,就不用这个。
    举例说明:
    现在要做一个加法。a+b=? 而a是需要计算才能知道的,而且需要比较长的时间。而b也需要计算,但可以相比a来说较快的得到。
    那么,A启动B计算a,然后A继续计算b,然后再等待信号S,等到S后计算得到结果,显示。
    B线程,计算a,发出信号S。
      

  4.   

    整个这句话就是错的,CPU不会让某个线程一直占用的,它肯定会让其它线程得到时间片来执行,至于得到的多少是靠优先级来决定的。
      

  5.   

    比如一个线程要用于计算,另一个在干其他的事情,比如供用户录入,那么用户录入线程在运行的时候,计算的线程是不是要放到一边去了?(即暂时不能运行)?
    ----------------------------------------------
    这个是系统内部调度的问题,实际上,用户输入数据的时候,CPU基本上是处于空闲状态的,系统应该会调度其他线程运行的。
      

  6.   

    比如一个线程要用于计算,另一个在干其他的事情,比如供用户录入,那么用户录入线程在运行的时候,计算的线程是不是要放到一边去了?(即暂时不能运行)?
    如果你没有手动进行同步的话(人为控制线程的执行),那么这两个线程的执行仍然是轮换CPU的时间片执行的。由于cpu的时间片很短,人感觉不到,就像在同时执行一样。。还有一个要注意的问题:程序中的IO,网络,等等,这些处理需要很长时间(相对于cpu时间片来说),如果你没有使用多线程,单线程会在此时等待,cpu就处于休息状态,利用率不高。如果使用了多线程,某线程由于IO操作等待过程中,另一个线程可以继续执行。多线程是通过增加cpu的利用率来提高程序性能。。
      

  7.   

    多线程是通过增加cpu的利用率来提高程序这句话说到了点子上
      

  8.   

    CPU时间片非常短. 比如有A,B两个线程, A执行一个时间后(非常短的时间),不管A有没有执行完他会马上执行B. 所以你看起来就像同时进行一样. 不会让你感觉有挂起.  除非你做了线程同步,A不执行完就不让B执行.
      

  9.   

    是这样的,如果你CPU个数非常多,计算机就能同时作多件事
    即使CPU只有一个,对你来说,线程切换你也是感觉不到的,比如就纯键盘输入显示来说,占用的CPU时间段是非常小的。