2013-09-21 69 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