族谱网 头条 人物百科

互斥锁

2017-10-16
出处:族谱网
作者:阿族小谱
浏览:531
转发:0
评论:0
需求不准永远耽搁一个要求进入临界区域的线程,造成死锁或是饥饿发生。若没有任何线程处于临界区域时,任何要求进入临界区域的线程必须立刻得到允许。不能对线程的相对速度与处理器的数目做任何假设。线程只能在临界区域内停留一有限的时间。任何时间只允许一个线程在临界区域运行。在临界区域停止运行的线程,不准影响其他线程运行。实现依实现方式可分为硬件实现和软件实现两种。硬件实现单核心系统上最常见的方式就是关闭尽可能多的可能对共享数据段进行读写的指令中断。这样一来就可以避免在临界区域中暂停程序执行,或是来自硬件的要求修改目标共享数据段的中断请求。多核心系统上则通过检查并置位(获取原始值并指定新值)机制达成,当一个核心需要另一个核心占用的资源的时候,该核心将不断的查询所有核心间共享的占用旗标,直到另一个核心将占用旗标复位为未使用为止。相关的伪代码如下所示:lock的值为1则表示锁被占用,为0则是空闲。在检查并置...

需求

不准永远耽搁一个要求进入临界区域的线程,造成死锁或是饥饿发生 。

若没有任何线程处于临界区域时,任何要求进入临界区域的线程必须立刻得到允许。

不能对线程的相对速度与处理器的数目做任何假设。

线程只能在临界区域内停留一有限的时间。

任何时间只允许一个线程在临界区域运行。

在临界区域停止运行的线程,不准影响其他线程运行。

实现

依实现方式可分为硬件实现和软件实现两种。

硬件实现

单核心系统上最常见的方式就是关闭尽可能多的可能对共享数据段进行读写的指令中断。这样一来就可以避免在临界区域中暂停程序执行,或是来自硬件的要求修改目标共享数据段的中断请求。多核心系统上则通过检查并置位(获取原始值并指定新值)机制达成,当一个核心需要另一个核心占用的资源的时候,该核心将不断的查询所有核心间共享的占用旗标,直到另一个核心将占用旗标复位为未使用为止。相关的伪代码如下所示:

lock的值为1则表示锁被占用,为0则是空闲。

在检查并置位机制中,一个核心在对旗标执行读写的过程当中不会释放占用的访问总线。该种方法又称为自旋锁。

类似的原子操作,如比较并交换机制,则更常用于对链表等数据结构进行不阻断同步。

软件实现

类似的方式也有通过软件模拟达成的。但是该种模拟会对计算机造成极大的负荷,因为申请占用自旋锁的过程中会不间断地对一个标志位进行读写,并且该种模拟不允许乱序执行,因为这会破坏其机制。

更为常见的是使用操作系统提供的互锁库,这种库通常设计为在有硬件支持时使用硬件机制,仅在找不到支持的硬件时才用软件模拟,并且结合线程调度对锁性能进行优化。比如一个线程要使用一个已经被占用的锁,这时候操作系统会把这个线程挂起,然后切换上下文到另外一个可以继续运行的线程,若是没有别的线程要继续运行的话,系统就让处理器进入低功耗状态,而不是让这个线程消耗大量处理能力进行自旋来等待锁释放。

现代的互斥锁大多使用队列和上下文切换以达到节约资源和降低延迟的目的。但是总有些情况下,挂起一个进程,然后过一阵子再恢复所用的时间会比让进程在那里自旋等待用的时间长。在这种情况下则更多会使用自旋锁。

高级的互斥锁实现

除了上述的基础互斥锁,还有一些更高级的实现方式,如:

信号标

重入锁

监视器

消息队列

元组空间

这些锁各有各的副作用。例如一个常见的信号标会允许死锁的发生(两条线程各自获取了一个信号标,然后都在等待对方释放另外一个)。其他可能会出现的现象有优先级倒置(高优先级的程序等待低优先级的程序完成)、资源饥荒(某个线程一直得不到足够的锁资源)等。

目前的研究多侧重于消除这些副作用上,例如不阻断同步,但是并没有完美的解决方案。

Windows的Mutex对象

Windows操作系统提供了mutex同步对象。它有两个状态:

signaled:如果它不被任何对象拥有;

nonsignaled:如果它被一个(且至多一个)线程拥有。

Windows API函数CreateMutex或CreateMutexEx创建mutex对象。使用OpenMutex函数打开一个mutex对象。也可以使用DuplicateHandle函数或者父子handle继承来使用一个无名mutex对象。

任何线程可以使用mutex的句柄(handle)于等待函数(wait functions)来获得这个mutex对象的拥有权。如果该mutex对象正被其他线程拥有,则请求的线程在该等待函数上被阻塞直到拥有的线程调用ReleaseMutex函数释放mutex并被该请求线程获取到拥有权。等待函数的返回值可以鉴别是否获得了拥有权(该mutex被signaled)或者其他原因(如超时返回).

如果多个线程正在等待一个mutex对象,那么该mutex被signaled时唤醒哪一个线程不能保证遵循先进先出(FIFO)顺序。外部事件如异步过程调用可改变等待顺序。

如果一个线程拥有了一个mutex对象,该线程可以对该mutex对象执行多次等待函数调用而不会被阻塞。释放mutex对象时,该线程必须调用ReleaseMutex函数的次数必须与调用等待函数的次数相同。

拥有mutex对象的线程没有释放拥有权就结束了,那么该mutex对象被放弃(abandoned). 等待该mutex对象的其他线程可获得拥有权,但从等待函数得到的返回值为WAIT_ABANDONED。

Windows操作系统的临界区(critical section)对象类似于mutex对象,但是临界区对象只能用于一个进程内部。

延伸阅读与参考书目

Michel Raynal: Algorithms for Mutual Exclusion, MIT Press, ISBN 0-262-18119-3

Sunil R. Das, Pradip K. Srimani: Distributed Mutual Exclusion Algorithms, IEEE Computer Society, ISBN 0-8186-3380-8

Thomas W. Christopher, George K. Thiruvathukal: High-Performance Java Platform Computing, Prentice Hall, ISBN 0-13-016164-0

Gadi Taubenfeld, Synchronization Algorithms and Concurrent Programming, Pearson/Prentice Hall, ISBN 0-13-197259-6

Article "Common threads: POSIX threads explained - The little things called mutexes" by Daniel Robbins

Mutual exclusion algorithm discovery

Mutual Exclusion Petri Net

Mutual Exclusion with Locks - an Introduction

Mutual exclusion variants in OpenMP

The Black-White Bakery Algorithm


免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。

——— 没有了 ———
编辑:阿族小谱

更多文章

更多精彩文章
评论 {{commentTotal}} 文明上网理性发言,请遵守《新闻评论服务协议》
游客
发表评论
  • {{item.userName}} 举报

    {{item.content}}

    {{item.time}} {{item.replyListShow ? '收起' : '展开'}}评论 {{curReplyId == item.id ? '取消回复' : '回复'}}

    回复评论
加载更多评论
打赏作者
“感谢您的打赏,我会更努力的创作”
— 请选择您要打赏的金额 —
{{item.label}}
{{item.label}}
打赏成功!
“感谢您的打赏,我会更努力的创作”
返回
打赏
私信

推荐阅读

· 互斥
逻辑学在逻辑学中,互斥(MutuallyExclusive)是一种逻辑关系,指几个变量或事件之中的任一个不可能与其它一个或多个同时为真,或同时发生的情况。对于逻辑函数,其变量互斥,意味着两个以上变量为真(包括都不为真)的情况会导致函数值为假。对于事件,其所有条件的互斥意味着,任两个条件的实现都将阻止事件的产生。同样可以引申到程序编写及其它关系。比如一个最简单的情况下,投掷一枚硬币,硬币不可能同时出现既为正也为反;两个结果互斥。概率学在概率学中,事件E1,E2,...,En在当其中任意一个事件与其余(n-1)个都不能同时发生时被称作互斥。用AB表示任意两个事件,即有公式:P(AandB)=0。在该样本空间中,所有互斥事件概率之和为1(即可拼为全概率)。若Ai∩∩-->Aj{\displaystyleA_{i}\capA_{j}}为空集,则该两子集或元素互斥。参考
· 长命锁(寄名锁)
长命锁也叫"寄名锁"。它是明清时挂在儿童脖子上的一种装饰物,按照迷信的说法,只要佩挂上这种饰物,就能辟灾去邪,"锁"住生命,所以许多儿童从出生不久起,就挂上了这种饰物,一直挂到成年。长命锁的前身是"长命缕"。关于佩长命缕的习俗,最早可追溯到汉代,据《荆楚岁时记》、《风俗通》、《岁时广记》以及《留青日札》等书的记载,在汉代,每逢五月初五端午佳节,家家户户都在门楣上悬挂上五色丝绳,以避不祥。到了魏晋南北朝时,这股丝绳被移到了妇女臂上,渐成为妇女和儿童的一种臂饰。不仅用于端午,还用于夏至。在当时,由于战争频繁,加之瘟疫、灾荒不断,广大人民渴望平安,所以用五色彩丝编成绳索,缠绕于妇女和儿童手臂,以祈求辟邪去灾,祛病延年。这种彩色丝绳,就被称之为"长命缕"、也有叫"长生缕"、"续命缕"、"延年缕"、"五色缕"、"辟兵缯"、"朱索"、"百索"等名称的。到了宋代,这种风俗,继续存在。不仅流行在民间,还传...
· 爱情锁
悬锁历史塞尔维亚弗尔尼亚奇卡矿泉镇至爱桥景爱情锁之肇始,可溯至一战以前塞尔维亚弗尔尼亚奇卡矿泉镇的至爱桥(MostLjubavi)。彼时,该镇女教师娜达(Nada)陷入与塞尔维亚王国军士官雷利亚(Relja)的热恋中。二人互誓永不变心。后雷利亚被征召前往希腊打仗,爱上一名来自克基拉岛的女孩而不归。远在故乡的娜达得知后,心碎而死。当地女孩们为纪念这段故事,并表达对自己爱情之捍卫,开始将镌有自己与恋人姓名的锁挂在当初之二人相遇的桥上,冀以防止对方变心。悬锁传统因二战爆发而中断,又因塞尔维亚女诗人德珊卡·马克西莫维奇(英语:DesankaMaksimović)笔下描绘这段爱情往事的诗歌《爱情祷告》(Molitvazaljubav)而再度受关注。观光季里,每日有大约五十人前来挂锁。2012年挂着爱情锁的巴黎艺术桥21世纪初,悬锁现象现于欧洲他地。如在巴黎,恋人们将名字镌在锁上,其中首字用大字号,而...
· 价层电子对互斥理论
理论基础价层电子对互斥理论的基础是,分子或离子的几何构型主要决定于与中心原子相关的电子对之间的排斥作用。该电子对既可以是成键的,也可以是没有成键的(叫做孤对电子)。只有中心原子的价层电子才能够对分子的形状产生有意义的影响。分子中电子对间的排斥的三种情况为:孤对电子间的排斥(孤-孤排斥);孤对电子和成键电子对之间的排斥(孤-成排斥);成键电子对之间的排斥(成-成排斥)。分子会尽力避免这些排斥来保持稳定。当排斥不能避免时,整个分子倾向于形成排斥最弱的结构(与理想形状有最小差异的方式)。孤对电子间的排斥被认为大于孤对电子和成键电子对之间的排斥,后者又大于成键电子对之间的排斥。因此,分子更倾向于最弱的成-成排斥。配体较多的分子中,电子对间甚至无法保持90°的夹角,因此它们的电子对更倾向于分布在多个平面上。实际预测下面是价层电子对互斥理论预测的分子形状表。†孤电子对以淡黄色球体表示。‡分子的实际几何...
· 正变锁
1960年4月出生,主治医师,1977年毕业于榆次县医卫班,1987年毕业于健康报振兴中医刊授学院,1991年毕业于乡村医生刊授学院。现任榆次市山庄头乡苏家庄村卫生所所长。从事基层医疗工作几十年,积累了丰富的临床诊治经验。攻读《内经》、《伤寒》、《金匾》、《本草纲目》等经典著作,并加强西医各科的学习,勤求苦训,博采众长,潜心钻研,理论联系实际,治愈多种顽症,具有一套独特的疗法。积累了一些单方、偏方、验方、中西医结合的大方,精湛的医术,高尚的医风医德,受到了同行及患者的称赞。擅长对农村常见病、多发病的治疗,尤其对脑血管病、风湿等病的治疗有专长。先后运用中西药治疗脑血管病上千例,采用偏方治疗风湿病取得较好的疗效。编著《医感》专著一部。

关于我们

关注族谱网 微信公众号,每日及时查看相关推荐,订阅互动等。

APP下载

下载族谱APP 微信公众号,每日及时查看
扫一扫添加客服微信