2012-03-16 106 views
3
Wait(semaphore sem) {       
    DISABLE_INTS 
    sem.val-- 
    if (sem.val < 0){ 
     add thread to sem.L 
     block(thread) 
    } 
    ENABLE_INTS 

Signal(semaphore sem){ 
    DISABLE_INTS 
    sem.val++ 
    if (sem.val <= 0) { 
     th = remove next 
     thread from sem.L 
     wakeup(th) 
    } 
    ENABLE_INTS 

如果block(thread)停止thread執行,它如何返回,何處,何時返回?等待/信號(信號量)如何實現僞代碼「工作」?

哪個線程在Wait()之後啓用中斷? thread調用block()應該不會返回,直到另一個線程調用wakeup(thread)

  • 但是其他線程如何運行?
  • 線程切換髮生在哪裏?
+0

此代碼從何而來? – 2012-03-16 21:04:38

+0

從演講幻燈片... http://web.cecs.pdx.edu/~walpole/class/cs333/fall2006/slides/5.ppt – 2012-03-16 21:14:39

回答

1

block(thread)這樣工作:

  1. 允許中斷
  2. 使用某種類型的等待機制(由操作系統或忙等待在最簡單的情況下提供)等到wakeup(thread)這個線程被調用。這意味着在這一點上thread會給調度器帶來時間。
  3. 禁用中斷和返回。
+0

等待機制使用**原子操作**(您可以,例如,在一個原子處理器指令中檢查一個標誌),以便您可以使用啓用的中斷。 – 2012-03-16 21:12:00

0

是,UPDOWN是從不同的線程調用時最有用,但它是不可能的,你把這些用一個線程 - 如果你用一個值> 0,信號量上啓動,然後在同一線程可以進入臨界區並執行DOWN(之前)和UP(之後)。初始化信號量的值告訴有多少線程可以一次進入臨界區,可能是1(互斥量)或任何其他正數。

線程是如何創建的?這在演講幻燈片中沒有顯示,因爲這只是信號量如何使用僞代碼的原理。但是,在應用程序中如何使用這些信號量是完全不同的故事。