当前位置:编程学习 > C#/ASP.NET >>

关于多线程的疑惑(牛人进)

比如拿书上常用的例子来说,多线程是程可以把占据长时间的程序中的任务放到后台去处理
现在比如我有个主线程,现开个辅助线程用于计算,
那这个辅助线程不是还要等我主线程挂起的时候他才能执行,或者等我设置了(set)了信号量他才可以执行的吗?那这个时候如果主线程一直在执行,这个辅助线程不是一直挂起吗?
那怎么能起到计算的作用呢,还不是要等我主线程执行完毕才释放信号量后他才可以继续执行吗?

怎么感觉这样还是顺序执行,而不是真正的同步嘛。请牛人来解惑 --------------------编程问答-------------------- 我不是牛人,但是我进来了。
楼主不介意吧。 --------------------编程问答--------------------
引用 1 楼 aricc 的回复:
我不是牛人,但是我进来了。
楼主不介意吧。 

 @ --------------------编程问答-------------------- CPU的运算是分时间片的,理论上讲,CPU没有真正意义上的并发
多线程,通俗的讲就是几个线程轮换时间片执行
比如线程A B C并发,S是CPU的时间片,那么A执行S时间(此时A可能并未完成运算),挂起,执行B S时间,B挂起,执行C,C挂起,再执行A。。。 --------------------编程问答-------------------- 一个线程在执行,另一个线程在等待,第一个线程执行到一个阶段,给一个信号,另一个线程继续执行,这不是同步吗? --------------------编程问答-------------------- 楼上的,那上面说的一个计算要很长时间的话,那按照这种说法他也是断断续续的执行了,其实执行需要的总时间是更长了,只是我们感觉不到而已? --------------------编程问答-------------------- 那这个辅助线程不是还要等我主线程挂起的时候他才能执行,或者等我设置了(set)了信号量他才可以执行的吗?
前半句是的,后半句有问题,信号量的设置是在线程准备运行前的一种条件配置,线程运行过程中,信号量是根据信号量的物理意义自动调整的。
那这个时候如果主线程一直在执行,这个辅助线程不是一直挂起吗?
当然,这是对于单cpu的情形,一个处理器处理的指令都是在排队过程中的,多线程只是我们感觉的多线程,对于某一个cpu他同一时间只会去处理一条指令;多cpu多线程代码写的合适可以达到真正的多线程效果。
那怎么能起到计算的作用呢,还不是要等我主线程执行完毕才释放信号量后他才可以继续执行吗?
是啊,信号量就是在协调线程间的关系。
怎么感觉这样还是顺序执行,而不是真正的同步嘛。
单cpu没有真正的多线程

--------------------编程问答-------------------- 我不是牛人,但是我进来了。

两颗 CPU,一颗在跑主线程。同时另外一个在跑辅助线程。

至于你所说的 set 问题, 你是手动干预了线程,是你命令它不要并行计算的,线程当然服从你的命令了。 --------------------编程问答-------------------- 你这个问题不用牛人也能答出来,呵呵。

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

整个这句话就是错的,CPU不会让某个线程一直占用的,它肯定会让其它线程得到时间片来执行,至于得到的多少是靠优先级来决定的。 --------------------编程问答-------------------- 大家动作好快啊。都8楼了。

晃眼啊 --------------------编程问答-------------------- 我是理解了,楼主看到这么多回复,不知道理解了没。 --------------------编程问答-------------------- 每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分   --------------------编程问答-------------------- 最简单的解释是,多人用一台电脑的问题。 --------------------编程问答--------------------
引用 11 楼 chaozi_249 的回复:
我是理解了,楼主看到这么多回复,不知道理解了没。


知道个大概了,不管是否多线程,执行的总时间还是那么多的,
还有个要问的

比如一个线程要用于计算,另一个在干其他的事情,比如供用户录入,那么用户录入线程在运行的时候,计算的线程是不是要放到一边去了?(即暂时不能运行)? --------------------编程问答-------------------- 担心这个干嘛  操作系统是干什么的
应该去看操作系统去 --------------------编程问答--------------------
引用 1 楼 aricc 的回复:
我不是牛人,但是我进来了。
 楼主不介意吧。
... --------------------编程问答-------------------- 这个东西就是那么玄乎,你说他不执行,他却在执行,你说他执行,他却在等待,这就是线程

--------------------编程问答-------------------- 比如一个线程要用于计算,另一个在干其他的事情,比如供用户录入,那么用户录入线程在运行的时候,计算的线程是不是要放到一边去了?(即暂时不能运行)?
----------------------------------------------
这个是系统内部调度的问题,实际上,用户输入数据的时候,CPU基本上是处于空闲状态的,系统应该会调度其他线程运行的。 --------------------编程问答-------------------- 我个人认为得分情况   我们编程当中故意让某一个线程等待  这相当于用户操作   而操作系统是对那些需要同时进行的线程进行自我调控  这俩个是不同级别的调度   --------------------编程问答-------------------- 比如一个线程要用于计算,另一个在干其他的事情,比如供用户录入,那么用户录入线程在运行的时候,计算的线程是不是要放到一边去了?(即暂时不能运行)?


如果你没有手动进行同步的话(人为控制线程的执行),那么这两个线程的执行仍然是轮换CPU的时间片执行的。由于cpu的时间片很短,人感觉不到,就像在同时执行一样。。

还有一个要注意的问题:程序中的IO,网络,等等,这些处理需要很长时间(相对于cpu时间片来说),如果你没有使用多线程,单线程会在此时等待,cpu就处于休息状态,利用率不高。如果使用了多线程,某线程由于IO操作等待过程中,另一个线程可以继续执行。

多线程是通过增加cpu的利用率来提高程序性能。。 --------------------编程问答-------------------- 多线程是通过增加cpu的利用率来提高程序

这句话说到了点子上 --------------------编程问答-------------------- 定制线程的时候是可以设置优先级的,操作系统也是根据优先级,选择调度,高优先级的优先调度。 --------------------编程问答-------------------- ::::: --------------------编程问答-------------------- CPU时间片非常短. 比如有A,B两个线程, A执行一个时间后(非常短的时间),不管A有没有执行完他会马上执行B. 所以你看起来就像同时进行一样. 不会让你感觉有挂起.  

除非你做了线程同步,A不执行完就不让B执行. --------------------编程问答-------------------- 是这样的,如果你CPU个数非常多,计算机就能同时作多件事
即使CPU只有一个,对你来说,线程切换你也是感觉不到的,比如就纯键盘输入显示来说,占用的CPU时间段是非常小的。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,