10年9个月前修改于 10年9个月前IP:四川
811332
7楼
单线程异步编程,是最简单也应用最广泛的异步编程形式,一般是注册个回调函数或同步事件,然后将线程处于idle状态(比如调用GetMessage/SleepEx/MsgWaitForSingleObject等),由系统在idle状态调用回调函数或触发同步事件,使得程序继续运行。使用这种异步形式需要考虑的问题最少,只需要注意,一是代码执行时间不要过长,二是回调函数触发顺序不能预测。由于函数触发顺序不能预测,所以要注意状态的传递问题。语言的闭包特性可以使得程序状态被继承,大大简化了异步编程。

多线程异步编程,一般是注册个回调函数,然后由系统直接创建新线程执行。比如.NET中的System.Threading.Timer。使用这种异步形式,不用担心代码执行时间过长的问题,但要考虑访问公共资源的同步问题,不然程序可能会出现错误结果甚至崩溃。这种异步形式对于系统资源的消耗也是比较大的。

中断是另一种异步编程,中断可以在非idle状态触发,并插入尚未执行完的程序中执行。中断异步编程最麻烦,除了上面所说的问题之外,还要考虑状态保护问题,不然正在执行的程序容易跑飞,甚至导致系统崩溃。大多数现代操作系统都将中断机制封装在ring0层,不允许ring3程序挂钩中断。

在JavaScript中异步编程应用非常广泛,是历史中长期没有多线程支持造成的。
评论
文号 / 811332

千古风流
名片发私信
学术分 4
总主题 466 帖总回复 2942 楼拥有证书:进士 学者 笔友
注册于 2009/05/30 21:22:42最后登录 2019/01/31 17:16:38
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:0

个人简介

暂未填写
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的