跳转到内容

互斥锁:修订间差异

维基百科,自由的百科全书
删除的内容 添加的内容
Le Concorde留言 | 贡献
无编辑摘要
标签模板被删除
Le Concorde留言 | 贡献
无编辑摘要
第4行: 第4行:


例如:一段代码(甲)正在分步修改一块数据。这时,另一条线程(乙)由于一些原因被唤醒。如果乙此时去读取甲正在修改的数据,而甲碰巧还没有完成整个修改过程,这个时候这块数据的状态就处在极大的不确定状态中,读取到的数据当然也是有问题的。更严重的情况是乙也往这块地方写数据,这样的一来,后果将变得不可收拾。因此,多个线程间共享的数据必须被保护。达到这个目的的方法,就是确保同一时间只有一个关键区域处于运行状态,而其他的关键区域,无论是读是写,都必须被挂起并且不能获得运行机会。
例如:一段代码(甲)正在分步修改一块数据。这时,另一条线程(乙)由于一些原因被唤醒。如果乙此时去读取甲正在修改的数据,而甲碰巧还没有完成整个修改过程,这个时候这块数据的状态就处在极大的不确定状态中,读取到的数据当然也是有问题的。更严重的情况是乙也往这块地方写数据,这样的一来,后果将变得不可收拾。因此,多个线程间共享的数据必须被保护。达到这个目的的方法,就是确保同一时间只有一个关键区域处于运行状态,而其他的关键区域,无论是读是写,都必须被挂起并且不能获得运行机会。

==延伸阅读与参考书目==
*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 "[http://www-106.ibm.com/developerworks/library/l-posix2/ Common threads: POSIX threads explained - The little things called mutexes]" by [[Daniel Robbins]]
*[http://bardavid.com/mead/ Mutual exclusion algorithm discovery]
*[http://www.cs.adelaide.edu.au/users/esser/mutual.html Mutual Exclusion Petri Net]
*[http://www.thinkingparallel.com/2006/09/09/mutual-exclusion-with-locks-an-introduction/ Mutual Exclusion with Locks - an Introduction]
*[http://www.thinkingparallel.com/2006/08/21/scoped-locking-vs-critical-in-openmp-a-personal-shootout/ Mutual exclusion variants in OpenMP]
*[http://www.faculty.idc.ac.il/gadi/Publications.htm The Black-White Bakery Algorithm]

2011年10月22日 (六) 13:33的版本

互斥锁机制(Mutual exclusion,缩写为Mutex)是一种用于多线程编程中,防止两条线程同时对同一公共资源(比如全局变量)进行读写的机制。该目的通过将代码切片成一个一个的关键区域达成。关键区域指的是一块对公共资源进行存取的代码,并非一种机制或是算法。一个程序、进程、线程可以拥有多个关键区域,但是并不一定会应用互斥锁。

需要此机制的资源的例子有:旗标队列计数器中断处理程序等用于在多条并行运行的代码间传递数据、同步状态等的资源。维护这些资源的同步、一致和完整是很困难的,因为一条线程可能在任何一个时刻被暂停(休眠)或者恢复(唤醒)。

例如:一段代码(甲)正在分步修改一块数据。这时,另一条线程(乙)由于一些原因被唤醒。如果乙此时去读取甲正在修改的数据,而甲碰巧还没有完成整个修改过程,这个时候这块数据的状态就处在极大的不确定状态中,读取到的数据当然也是有问题的。更严重的情况是乙也往这块地方写数据,这样的一来,后果将变得不可收拾。因此,多个线程间共享的数据必须被保护。达到这个目的的方法,就是确保同一时间只有一个关键区域处于运行状态,而其他的关键区域,无论是读是写,都必须被挂起并且不能获得运行机会。

延伸阅读与参考书目