2013-09-21 46 views
2

考虑这个可能的实现同步机制的,目的是只有一个线程是在临界段(CS)在时间:如果(锁定)等待其他锁= 1把CS锁= 0

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

这是否适用于多处理器系统?

+2

方面缺少... – 2013-09-21 10:21:11

+0

@ H2CO3语境容易推断,如果你知道的问题,虽然。我已经编辑它。 – Gilles

回答

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提供不同的方法,有时不止一个。)

+0

你能告诉我们如何纠正这个代码的单处理器系统?测试和设置只会使其适用于多处理器系统,对吧? – Gaurav

+0

@Gaurav检查并设置为[自旋锁]的构建块(http://en.wikipedia.org/wiki/Spinlock),锁定的实现,其适于被采取非常短的时间锁定。您需要确保其他线程可以在线程执行“wait”时运行。有除了作为构建块与一个等待队列互斥为自旋锁很少使用单处理器系统上,但它的工作原理处理器数量无关。 – Gilles