CPU的运算是分时间片的,理论上讲,CPU没有真正意义上的并发
多线程,通俗的讲就是几个线程轮换时间片执行
比如线程A B C并发,S是CPU的时间片,那么A执行S时间(此时A可能并未完成运算),挂起,执行B S时间,B挂起,执行C,C挂起,再执行A
多线程,通俗的讲就是几个线程轮换时间片执行
比如线程A B C并发,S是CPU的时间片,那么A执行S时间(此时A可能并未完成运算),挂起,执行B S时间,B挂起,执行C,C挂起,再执行A
前半句是的,后半句有问题,信号量的设置是在线程准备运行前的一种条件配置,线程运行过程中,信号量是根据信号量的物理意义自动调整的。
那这个时候如果主线程一直在执行,这个辅助线程不是一直挂起吗?
当然,这是对于单cpu的情形,一个处理器处理的指令都是在排队过程中的,多线程只是我们感觉的多线程,对于某一个cpu他同一时间只会去处理一条指令;多cpu多线程代码写的合适可以达到真正的多线程效果。
那怎么能起到计算的作用呢,还不是要等我主线程执行完毕才释放信号量后他才可以继续执行吗?
是啊,信号量就是在协调线程间的关系。
怎么感觉这样还是顺序执行,而不是真正的同步嘛。
单cpu没有真正的多线程
从微观上看,两个线程都会得到CPU的时间片,所以两个是交替执行的。也就是你说的顺序执行吧。
从宏观上看A、B是同时执行的。并不是顺序执行。
另外你说的信号什么的是在两个线程需要同步的时候才需要的。如果不需要同步的话,就不用这个。
举例说明:
现在要做一个加法。a+b=? 而a是需要计算才能知道的,而且需要比较长的时间。而b也需要计算,但可以相比a来说较快的得到。
那么,A启动B计算a,然后A继续计算b,然后再等待信号S,等到S后计算得到结果,显示。
B线程,计算a,发出信号S。
----------------------------------------------
这个是系统内部调度的问题,实际上,用户输入数据的时候,CPU基本上是处于空闲状态的,系统应该会调度其他线程运行的。
如果你没有手动进行同步的话(人为控制线程的执行),那么这两个线程的执行仍然是轮换CPU的时间片执行的。由于cpu的时间片很短,人感觉不到,就像在同时执行一样。。还有一个要注意的问题:程序中的IO,网络,等等,这些处理需要很长时间(相对于cpu时间片来说),如果你没有使用多线程,单线程会在此时等待,cpu就处于休息状态,利用率不高。如果使用了多线程,某线程由于IO操作等待过程中,另一个线程可以继续执行。多线程是通过增加cpu的利用率来提高程序性能。。
即使CPU只有一个,对你来说,线程切换你也是感觉不到的,比如就纯键盘输入显示来说,占用的CPU时间段是非常小的。