1. 程式人生 > >程序互斥與程序同步

程序互斥與程序同步

程序之間的相互作用關係分為兩種,一種是共享資源的關係,一種是相互合作的關係,前者屬於程序互斥、後者屬於程序同步。我們把實現這兩類相互制約關係的機制,統稱為程序同步機制。同步機制有四大原則:空閒讓進、忙則等待、有限等待、讓全等待。

程序互斥:程序間的間接作用關係。兩個或兩個以上的程序,不能同時進入關於同一組共享變數的臨界區域。比較典型的問題是印表機的共享訪問。
程序同步:程序間的直接作用關係。在多道程式環境下,程序是併發執行的,不同程序之間存在著不同的相互制約關係。比較典型的問題有生產消費者問題、哲學家進餐問題等。

實現程序互斥的方式有:設定臨界區、使用互斥量。

1.臨界區,顧名思義,有一段程式碼區,每次最多隻能由一個程序訪問。由於程序是資源分配的最小單位,所以在臨界區內資源的訪問只能是同一程序下的子程序或執行緒訪問。所以臨界區的使用存在著侷限性。臨界區的使用操作原語有兩個:EnterCriticalSection() 進入臨界區
LeaveCriticalSection() 離開臨界區

2.互斥量,字面上理解就是互斥訪問的資源,只不過該資源是公用的,而不是某個程序私有的,所以這種機制可以實現不同程序的互斥。互斥量所使用的操作原語有四個:
CreateMutex() 建立互斥量
OpenMutex() 開啟互斥量
ReleaseMutex() 釋放互斥量
WaitForMultipleObjects() 等待互斥量

實現程序同步方式:使用訊號量。
訊號量的特點就是允許多個程序同時訪問,數量由資源數目決定。
訊號量包含的幾個操作原語:
  CreateSemaphore() 建立訊號量
  OpenSemaphore() 開啟訊號量
  ReleaseSemaphore() 釋放訊號量
  WaitForSingleObject() 等待訊號量