管程

管程是一種高級的同步原語。
重要特性:任意時刻管程中只能有一個活躍進程。
它是一種編程語言的組件,因此編譯器知道它們很特殊,並能夠採用與其餘過程調用不一樣的方法來處理它們。典型地,當一個進程調用管程中的過程,前幾條指令將檢查在管程中是否有其餘的活躍進程。若是有,調用進程將掛起,直到另外一個進程離開管程。若是沒有,則調用進程便進入管程。
對管程的實現互斥由編譯器負責!
在Java中,只要將關鍵字synchronized加入到方法聲明中,Java保證一旦某個線程執行該方法,就不容許其餘線程執行該方法,就不容許其餘線程執行該類中的任何其餘方法。
 
注意:管程是一個編程語言概念。 編譯器必需要識別出管程並用某種方式對互斥作出安排。C、Pascal及多數其餘語言都沒有管程,因此期望這些編譯器來實現互斥規則是不可靠的。
 
下面的來自wikipedia:

管程 (英語Moniters,也稱爲監視器) 是一種程序結構,結構內的多個子程序(對象模塊)造成的多個工做線程互斥訪問共享資源。這些共享資源通常是硬件設備或一羣變量。管程實現了在一個時間點,最多隻有一個線程在執行管程的某個子程序。與那些經過修改數據結構實現互斥訪問的併發程序設計相比,管程實現很大程度上簡化了程序設計。php

管程提供了一種機制,線程能夠臨時放棄互斥訪問,等待某些條件獲得知足後,從新得到執行權恢復它的互斥訪問。編程

管程是東尼·霍爾 [1] 與泊·派克·漢森 [2]提出的,並由泊·派克·漢森首次在並行Pascal中實現。東尼·霍爾證實了這與信號量是等價的。管程在當時也被用於單操做系統環境中的進程間通訊。數據結構

在編程語言Concurrent PascalPascal-PlusModula-2Modula-3Mesa以及Java中都提供這個功能。併發

一個管程包含:編程語言

一個管程的程序在運行一個線程前會先取得互斥鎖,直到完成線程或是線程等待某個條件被知足纔會放棄互斥鎖。若每一個執行中的線程在放棄互斥鎖以前都能保證不變量成立,則全部線程皆不會致使競態條件成立。函數

如下這個銀行帳戶的提款/存款事務的管程是個簡單的例子:ui

monitor class Account {
  private int balance := 0
  invariant balance >= 0

  public method boolean withdraw(int amount)
     precondition amount >= 0
  {
    if balance < amount then return false
    else { balance := balance - amount ; return true }
  }

  public method deposit(int amount)
     precondition amount >= 0
  {
    balance := balance + amount
  }
}

當一個線程執行管程中的一個子程序時,稱爲佔用(occupy)該管程. 管程的實現確保了在一個時間點,最多隻有一個線程佔用了該管程。這是管程的互斥鎖訪問性質。spa

當線程要調用一個定義在管程中的子程序時,必須等到已經沒有其它線程在執行管程中的某個子程序。操作系統

在管程的簡單實現中,編譯器爲每一個管程對象自動加入一把私有的互斥鎖。該互斥鎖初始狀態爲解鎖,在管程的每一個公共子程序的入口給該互斥鎖加鎖,在管程的每一個公共子程序的出口給該互斥鎖解鎖。線程

這個例子中的不變量是「任何操做運行前 balance 變量必須反映正確的餘額」。通常而言,不變量的條件不被寫在程序中,而在註解中有相關說明,然而Eiffel程序設計語言檢查不變量。


管程做爲一個模塊,它的類型定義以下:
    monitor_name = MoNITOR; 
       共享變量說明; 
       define 本管程內部定義、外部可調用的函數名錶; 
       use 本管程外部定義、內部可調用的函數名錶; 
       內部定義的函數說明和函數體 
       { 
         共享變量初始化語句; 
       } 
相關文章
相關標籤/搜索