注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

为着理想勇敢前进

 
 
 

日志

 
 

永远不要等待特定的某件事情发生……  

2007-02-03 19:17:02|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

阻塞有两种,一种是等待不特定的事情发生,例如Win32 API的GetMessage或GetQueuedCompletionStatus,另一种则是等待特定的事件,比如Win32 API的WaitForSingleObject。然而,最容易碰到的“等待特定的某事”的情况则是阻塞的读取一个文件或一个socket。

前者没有危害,因为他们等待的是不特定的消息,别的线程可以唤醒他们。然而,后者相当危险,而且没有任何办法可以解决。

影响危害程度的唯一因素是等待的时间长短。等待时间短的时候危害比较轻,比如本地磁盘的读写,对于网络通讯来说,这就相当严重,TCP的超时至少也是几十秒,是一个让人类都无法忍受的超长时间。

首先,我们知道,别的线程没有办法安全的杀死这个阻塞的线程,那会导致内存泄露,因为CRT需要在线程结束以后运行一些清理工作。表面上看,的确是可以用多线程来避免阻塞UI线程,但是,那也意味着任何对工作线程的操作都需要等待几十秒才有效。 比如我们想要安全的停掉工作线程,我们用一个讨厌的全局变量去通知工作线程,而工作线程在一个循环里检查这个全局变量,这种做法很丑陋,更可悲的是,由于工作线程的阻塞,可能需要几十秒他才会检查到这个全局变量。而UI线程如果需要在工作线程被结束以后才执行某个特定的操作,他也不得不阻塞几十秒。

本文所描述的情况很多人也都碰见过。然而,这司空见惯的情况加上显而易见的逻辑推导出的结论却是令人震撼的——永远不要等待特定的某件事情发生,也永远不要使用任何阻塞IO。

  评论这张
 
阅读(197)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018