第一次作業 加鎖

2021-07-11 08:23:57 字數 2154 閱讀 7062

定義:

鎖機制是多執行緒程式設計中最常用的同步機制,用來對多執行緒間共享的臨界區進行保護。

鎖的型別、什麼情況下會用到鎖機制?

共4種:spinlock(自旋鎖)、 mutex(互斥量)、 semaphore(訊號量)、 critical section(臨界區);

當需要對臨界區進行保護事,我們會使用鎖機制。

不同 鎖的定義及區別:

1.讀寫鎖(read-write lock)讀寫鎖又稱為共享獨佔鎖(shared-exclusive lock)、多讀單寫鎖(multiple-read/single-write lock)或者非互斥訊號量(non-mutual exclusion semaphore)。讀寫鎖允許多個執行緒同時進行讀訪問,但是在某一時刻卻最多只能由乙個執行緒執行寫操作。對於多個執行緒需要同時讀共享資料卻並不一定進行寫操作的應用來說,讀寫鎖是一種高效的同步機制。對於較長的共享資料,只為其設定乙個讀寫鎖會導致較長的訪問時間,最好將其劃分為多個小段並設定多個讀寫鎖以進行同步。

3.互斥量(mutex)互斥量是實現最簡單的鎖型別,因此有一些教科書一般以互斥量為例對鎖原語進行描述。互斥量的釋放並不僅僅依賴於釋放操作,還可以引入乙個定時器屬性。如果在釋放操作執行前發生定時器超時,則互斥量也會釋放**塊或共享儲存區供其他執行緒訪問。當有異常發生時,可使用try-finally語句來確保互斥量被釋放。定時器狀態或try-finally語句的使用可以避免產生死鎖。

4.遞迴鎖(recursive lock)遞迴鎖是指可以被當前持有該鎖的執行緒重複獲取,而不會導致該執行緒產生死鎖的鎖型別。對遞迴鎖而言,只有在當前持有執行緒的獲取鎖操作都有乙個釋放操作與之對應時,其他執行緒才可以獲取該鎖。因此,在使用遞迴鎖時,必須要用足夠的釋放鎖操作來平衡獲取鎖操作,實現這一目標的最佳方式是在單入口單出口**塊的兩頭一一對應地使用獲取、釋放操作,做法和在普通鎖中一樣。遞迴鎖在遞迴函式中最有用。但是,總的來說,遞迴鎖比非遞迴鎖速度要慢。需要注意的是:呼叫執行緒獲得幾次遞迴鎖必須釋放幾次遞迴鎖。

5.大核心鎖:大核心鎖是用來保護臨界區資源,避免出現多個處理器上的程序同時訪問同一區域的。但這把鎖獨特的地方是,它不象自旋鎖或訊號量一樣可以建立許多例項或者叫物件,每個物件保護特定的臨界區。事實上整個核心只有一把這樣的鎖,一旦乙個程序獲得大核心鎖,進入了被它保護的臨界區,不但該臨界區被鎖住,所有被它保護的其它臨界區都將無法訪問,直到該程序釋放大核心鎖。這看似不可思議:乙個程序在乙個處理器上操作乙個全域性的鍊錶,怎麼可能導致其它程序無法訪問另乙個全域性陣列呢?使用兩個自旋鎖,乙個保護鍊錶,另乙個保護陣列不就解決了嗎?可是如果你使用大核心鎖,效果就是這樣的。

自旋鎖與互斥鎖的區別:自旋鎖不會引起呼叫者睡眠,如果自旋鎖已經被另的執行單元保持,呼叫者就一直迴圈在那裡,看是否該自旋鎖的保持者已經釋放了鎖,「自旋」一詞而就是因此而得名。其作用是為了解決某項資源的互斥使用。因為自旋鎖不會引起呼叫者睡眠,所以自旋鎖的效率遠高於互斥鎖。

**如何體現加鎖:

互斥鎖:實際上是先給count做自減操作,然後使用本身的自旋鎖進入臨界區操作。首先取得count的值,再將count置為-1,判斷如果原來count的值為1,也即互斥鎖可以獲得,則直接獲取,跳出。否則進入迴圈反覆測試互斥鎖的狀態。在迴圈中,也是先取得互斥鎖原來的狀態,再將其置為-1,判斷如果可以獲取(等於1),則退出迴圈,否則設定當前程序的狀態為不可中斷狀態,解鎖自身的自旋鎖,進入睡眠狀態,待被在排程喚醒時,再獲得自身的自旋鎖,進入新一次的查詢其自身狀態(該互斥鎖的狀態)的迴圈。

訊號量:訊號量在建立時需要設定乙個初始值,表示同時可以有幾個任務可以訪問該訊號量保護的共享資源,初始值為1就變成互斥鎖(mutex),即同時只能有乙個任務可以訪問訊號量保護的共享資源。乙個任務要想訪問共享資源,首先必須得到訊號量,獲取訊號量的操作將把訊號量的值減1,若當前訊號量的值為負數,表明無法獲得訊號量,該任務必須掛起在該訊號量的等待佇列等待該訊號量可用;若當前訊號量的值為非負數,表示可以獲得訊號量,因而可以立刻訪問被該訊號量保護的共享資源。當任務訪問完被訊號量保護的共享資源後,必須釋放訊號量,釋放訊號量通過把訊號量的值加1實現,如果訊號量的值為非正數,表明有任務等待當前訊號量,因此它也喚醒所有等待該訊號量的任務。

第一次作業

1.用較低的成本,開發出滿足客戶需求的軟體,開發的軟體可靠性高,易於維護和移植 2.分為設計階段,開發階段和測試執行階段 1 設計階段 分析客戶需求,明確要解決哪些問題,實現哪些功能,以及確定基本方法 2 開發階段 a.概要設計 畫出流程圖,進行模組化劃分,建立模組的層次結構以及呼叫關係 b.詳細設...

第一次作業

1.4 非計算機專業 程式和軟體有何不同?答 程式是通過計算機語言寫出來的具有許多演算法的摸板,是實現軟體功能的底層推手 推手的意思可以理解為動力 所以,程式是軟體的內在因子,而軟體是乙個或多個程式通過編譯器編譯出來的成品。1.3 查詢資料,解釋什麼是圖靈測試?答 指測試者與被測試者 乙個人和一台機...

第一次作業

1.解釋什麼是圖靈測試?圖靈測試 又稱 圖靈判斷 是圖靈提出的乙個關於機械人的著名判斷原則。一種測試機器是不是具備人類智慧型的方法。如果說現在有一台電腦,其運算速度非常快 記億容量和邏揖單元的數目也超過了人腦,而且還為這台電腦編寫了許多智慧型化的程式,並提供了合適種類的大量資料,使這台電腦能夠做一些...