Dekker's algorithm

原文: http://hi.baidu.com/rodimus/item/dc47c11f76e59cf786ad4e9e


        这是实现锁的一种算法。这种算法只解决两个线程竞争资源的情况。为了不让两个线程同时执行一段代码,比较直观的方案是设一个共享bool变量,线程进入前先检测它的值,有线程进入后改变它的值。但是在并发的情况下,可能在A检查完认为B没进入,准备改备值前,B也检测完了,这时候就两个线程都进入了。为了解决这个问题AB应该能够知道对方的情况,所以把一个BOOL变量变成两个BOOL变量,分别表示AB是否已经到这个区域。这时候怎么决定谁先继续走下去呢?要增加一个BIT,等于0表示A,等于1表示B,A,B进入后都把这个值改成它们对应的值,在决定往下走前,再回头检查一下这个值,看有没有被别人改了,如果被对方改了,则让对方先走。如果没被对方改,则认为自己仍然应该走,但是在对方放弃之前,不继续往下走。这时候会不会两个人都不往下走呢?不会的,因为那个BIT不是0就是1,所以总有一个人放弃的。也有一种可能是对方已经进入临界区,这时候对方就会一直执行到结束才修改自身状态,另一个线程才能往下走。

伪码为:

flag[0]   = 0
flag[1]   = 0

P0: flag[0] = 1                        P1: flag[1] = 1
     turn = 1                               turn = 0
     while (flag[1] && turn==1);            while (flag[0] && turn == 0); //Busy test loop
     // critical section                    // critical section
        ...                                    ...
     // end of critical section             // end of critical section
     flag[0] = 0                            flag[1] = 0

这个算法的好处是,不用硬件配合。当然局限也是很明显的,只支持两个线程。另外这是一个很古老的算法,在现在某些CPU架构下是不能工作的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值