一、简介
二、为什么会存在互斥? 【相关文章:慷慨解囊:Adobe将大笔代码捐赠给Mo】
借助于ajax技术,一个浏览器页面能够实现在后台向服务器发出数据请求的同时,前端用户接口继续保持活动状态。这导致一种典型问题的出现—前面两种活动同时存取普通javascript与dom数据结构。传统情况下,对于这种并发编程问题的解决方案并不是使用javascript提供的。本文正是描述一种改进的经过证明的互斥机制—它能够使用javascript实现并发编程,从而有效地克服javascript所存在的局限性。 【扩展阅读:IBM不再使用电视广告做刀片服务器宣传】
你可能会问:“为什么我没有遇到过这种情况呢?”遗憾的是,这种类型的问题往往是时间依赖性的(也叫作“竞态条件”);因此,它们不会总是出现,而是根据多种因素接一定的概率出现。为了实现健壮性,ria(丰富的互联网应用程序)必须通过一定措施来预防这种情况的发生。 【扩展信息:3G前夜WiMAX激流暗涌(1)】
在任何时候,只要程序中存在要求同时存取相同数据的多线程逻辑,那么就会存在互斥问题。正常情况下,这些程序都假定它们所与之交互的数据是不会发生改变的。存取这些共享数据结构的代码部分称作“临界区”,而每次仅允许一个执行的操作称为互斥操作。当异步地处理来自于xmlhttprequest响应的代码要求同时操作用户接口代码部分使用的数据时,这种情形也出现在ajax应用程序中。这种共享数据可能是实现一种mvc数据模型的javascript变量,也可能是web页面本身的dom。如果任何一方对共享数据作了不当修改,那么双方逻辑都会中断。
因此,我们需要建立一种互斥机制以确保每次操作中仅有一个临界区开始与结束(不能交叉)。大多数主流计算机语言与执行框架都提供了若干种互斥机制;然而,遗憾的是,这种互斥机制却并不存在于浏览器端javascript语言中。尽管目前已经存在一些杰出的不要求特殊语言或环境支持的互斥算法,但即使这些算法也要求实现一些javascript与浏览器(例如internet explorer)所不支持的功能。最后,不得不对这些算法加以改编才克服这些浏览器与语言限制。
三、bakery算法
在计算机科学的几种著名的互斥算法中,一种著名的算法就是lamport发明的bakery算法。该算法适用于,当任何两个线程之间的通讯是共享存储时,控制多个线程之间的共享存储竞争。在这种算法中,以“面包店”形象地比作一个信号量,顾客为了购买面包必须按序号等待,直到他们的号码被调用为止。列表1是这个算法的大致框架(来自于wikipedia)。该算法能够使得每一个线程都可以毫无冲突地进入与退出临界区。
//声明全局变量并对之赋初值
enter,number:array [1..n] of integer = {0}; //由每一个线程所使用的逻辑... //下面描述的“(a, b)<(c,d)” //意味着“(a<c) or ((a==c) and (b<d))” ... 下一页