併發控制經驗之談

2021-05-23 07:30:31 字數 1039 閱讀 3943

多年使用鎖的經驗說明,我們很難駕輕就熟地使用鎖。併發的管理本來就非常棘手,而許多使用方法都可能導致錯誤。本文將總結一些併發控制中容易導致錯誤的東西。

不明確的規則:

恰當的鎖定模式需要清晰和明確的規則。當我們建立乙個可被並行訪問的物件時,應該同時定義用來控制訪問的鎖。鎖定模式必須在一開始就安排好,否則其後的改進將會非常困難。先期的時間投入通常會在除錯階段獲得收益。

在編寫**時肯定會遇到幾個函式,它們均需要訪問某個受特定鎖保護的結構。這時。我們必須小心:如果某個獲得鎖的函式要呼叫其它同樣試圖獲取這個鎖的函式。我們的**就會死鎖。不論是訊號量還是自旋鎖,都不允許鎖擁有者第二次獲得這個鎖;如果試圖這麼 做,系統將掛起。

為了讓鎖定正確工作,則不得不編寫一些函式,這些函式假定呼叫者已經獲取了相關的鎖。通常,內部的靜態函式可以通過這種方式編寫。而提供給外部呼叫的函式則必須顯式地處理鎖定。在編寫那些假定呼叫者已經處理了鎖定的內部函式時,我們自己因該顯式地說明這種假定。因為如果在幾個月之後再回過頭來看這些**時,我們會發現很難記清在呼叫某個特定函式時是否需要擁有鎖。

鎖的順序規則:

在使用大量鎖的系統中,**通常需要一次擁有多個鎖。如果某種型別的計算必須使用兩個不同的資源來完成,而每個資源都有自己的鎖,則通常沒有其他辦法來同時獲取這兩個鎖。

但是,擁有多個鎖可能很危險。如果我們有兩個鎖,分別是lock1和lock2,而**需要同時獲取這兩個鎖,這時就有可能進入潛在的死鎖。想象某個執行緒鎖定了lock1,而其他執行緒鎖定了lock2.這時每個執行緒都試圖獲得另外的那個鎖,於是兩個執行緒都將死鎖。

對於這個問題的解決辦法通常比較簡單:在必須獲取多個鎖時,應該始終以相同的順序獲得。只要遵守這個約定,如上所述的那種死鎖就可以避免。但是,下面的鎖順序規則說起來要比做起來容易。這類規則基本上不會出現在某個實際的系統中。通常。最好的辦法是了解其他**的做法。

有幫助的規則有兩個:如果我們必須獲得乙個區域性鎖(比如乙個裝置鎖),以及乙個屬於核心更中心位置的鎖。則應該首先獲取自己的區域性鎖。如果我們擁有訊號量和自旋鎖的組合,則必須首先獲得訊號量;在擁有自旋鎖時呼叫down(可能導致休眠)是個嚴重的錯誤。當然最好的辦法是避免出現需要多個鎖的情況。

面試經驗之談

這裡是2017年11月7日,鄙人不才,17年應屆畢業,經驗不足,十一之後來到上海找工作,目前一無所獲。無奈,今天又逛了一趟培訓機構,看著和自己年齡相仿同學在前台焦急等待的時候感觸頗深,為什麼總是接到培訓機構的邀請,而不見想象之中offer也看不見期待的公司的回覆。剛好有哥哥姐姐在上海這邊,所以借住在...

幾次面試經驗之談

幾次面試經驗之談 文 飛天含雪 從十一假期結束到現在,近乙個月了,大大小小的面試總共參加了六七場,對面試有些感想,筆者知道網上談論該話題也多,但要麼片面,要麼扯淡,不僅達不到目的,反而有誤導民眾之嫌,筆者今日將經驗之談一一和盤托出,希望大家能有所借鑑。一 首當其衝 者 凶多吉少 收拾殘局 者 漁翁得...

C語言經驗之談

一 int 10 9 9位數 long long 10 18 18位數 long long bignum 1234567890112345ll 不要用float,碰到浮點型的資料都應該用double來儲存 二 0 9 a z a z等都是可顯示字元,它們的ascii碼分別是48 57 65 90 9...