首页 新闻 会员 周边

同步会启用新的线程吗

0
[已解决问题] 解决于 2011-10-27 11:51

相信大家都知道有同步和异步两种调用方式.区别我就不多说了,只想请教一下: 同步调用的时候(比方说invoke),此时,主程序的线程会处于阻塞状态,等待被调用方完成后,才可以继续执行。但此时,主线程既然都阻塞了,是不是应该有个新的线程去执行被调用方的操作呢?好多都说,异步才会在线程池里启动一个新的线程,同步不会,使用相同线程。可是不会的话,这个线程已经阻塞了,还怎么继续使用呢?

leon_ALiang的主页 leon_ALiang | 初学一级 | 园豆:194
提问于:2011-10-24 16:07
< >
分享
最佳答案
0

基本知识。。

同步和异步是针对调用是否会立即执行来说的。

异步肯定是另起一个线程来执行。

同步调用方式可以用当前线程执行,也可以用另一个线程来执行。

总之需要等到调用完成才能继续执行后面的代码,所以也叫阻塞了。(跟用哪个线程执行没有关系。)

常用的invoke方式是直接用当前线程来执行的。

当然你也可以写自己的invoke, 另起一个线程来执行,然后当前线程等待(可以用while(ture)方式检查某个条件,笨方式,也可以用同步信号。(ManualResetEvent/AutoResetEvent 之类的来同步))

边城浪 | 菜鸟二级 |园豆:264 | 2011-10-24 17:12

非常感谢回复!
还是有一个地方稍微不明白,既然同步可以使用当前线程,此时这个线程阻塞了,还怎么去执行被调用方的操作呢? 总觉得这里面有一些矛盾。

leon_ALiang | 园豆:194 (初学一级) | 2011-10-25 13:10

@leon032: 

看你对这个阻塞怎么理解了。

阻塞是相对于当前执行处来说的。意思是需要等到执行完成才会执行后面的代码。

阻塞不等于挂起,跟线程挂起是两种说法。

边城浪 | 园豆:264 (菜鸟二级) | 2011-10-25 14:31
其他回答(2)
0

关注...

星小野 | 园豆:234 (菜鸟二级) | 2011-10-24 16:19
0

线程只是载体.线程上承载的是指令(由你编写的代码编译而成).同步调用时,被调用方的指令会嵌入到调用线程上;异步调用时,启动新线程的指令会嵌入到调用线程上,而具体的被调用方的指令会嵌入新启动的线程上.

在执行流程上,同步调用时,CPU需要执行完所有承载在调用线程上的指令,包括被调用方的指令;异步调用时,CPU只需执行完在调用线程上承载的启动新线程的指令,然后,CPU会转到新线程上去执行被调用方的指令.

Launcher | 园豆:45045 (高人七级) | 2011-10-25 14:24

dfs

支持(0) 反对(0) 丫a 头 | 园豆:215 (菜鸟二级) | 2011-10-25 14:34

非常感谢两位的积极回复 @边城浪,@荒原上的军旗

看了一下阻塞和挂起的区别: 

《阻塞(pend)就是任务释放CPU,其他任务可以运行,一般在等待某种资源或信号量的时候出现。挂起(suspend)不释放CPU,如果任务优先级高就永远轮不到其他任务运行,一般挂起用于程序调试中的条件中断,当出现某个条件的情况下挂起,然后进行单步调试。》

原来阻塞是释放CPU的,再结合@荒原上的军旗 的指教,这下总算有个比较清楚点的认识了。

再次感谢两位。

 

支持(0) 反对(0) leon_ALiang | 园豆:194 (初学一级) | 2011-10-25 18:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册