if(lock)等待else lock = 1 CS lock = 0

时间:2013-09-21 10:20:09

标签: concurrency synchronization locking

考虑这种同步机制的可能实现,目标是一次只有一个线程在关键部分(CS)中:

if (lock)
      wait
else
     lock=1
      CS
     lock=0

这适用于多处理器系统吗?

1 个答案:

答案 0 :(得分:4)

没有。这甚至不适用于单处理器系统。假设你有两个线程这样做。他们可以这样安排:

thread1                     thread2
if (lock) /*false*/
                            if (lock) /*false*/
                            lock=1
lock=1
/*CS*/
                            /*CS*/
/*CS continues*/
                            /*CS continues*/
                            lock=0
lock=0

您不能以这种方式实现锁定。实现锁定的一种方法是使用处理器指令原子检查变量分配给它的当前值,例如test-and-set。 (还有许多其他可能的方法,不同的CPU提供不同的方法,有时不止一种。)