2012-04-26 110 views
0

我有一些代碼需要使用信號量或互斥鎖來鎖定。 的代碼是這樣的:信號量/互斥量鎖定/解鎖頻率

callA(); 
callB(); 
callC(); 
. 
. 
. 
callZ(); 

我想知道有效的方式將其鎖定。我正在考慮的選項是

  • 在callA()之前鎖定並在callZ()之後解鎖。我擔心的是鎖定時間很長。

  • 每次函數調用後鎖定和解鎖。我擔心抓住和釋放鎖的'過多的開銷'。

Appreciare您的幫助!

回答

3

這一切都取決於您的使用情況。您可以容忍多少鎖定/解鎖/鎖定/解鎖性能損失?衡量這一點,你願意在等待鎖定的時候再做一個任務嗎?一些線程是否具有延遲關鍵性或交互性,以及其他線程是批量還是低優先級?是否還有其他任務會通過其他代碼路徑採用相同的鎖?如果是這樣,那些是什麼樣的?如果callAcallB等中的關鍵部分真的是分開的,那麼您是否想使用26個不同的鎖?還是他們操縱相同的數據,迫使你使用一個單一的鎖?

順便說一句,如果你使用的是Linux,肯定使用(並行線程)互斥,不信號燈。互斥體的快速路徑完全是用戶可用的。在沒有爭用的情況下鎖定和解鎖它們非常便宜。信號量沒有快速路徑。

不知道別的,我會建議細粒度鎖,特別是如果你的個人功能已經組織不作出假設,如果鎖在它們之間都認爲只會是真實的。但正如我所說,這實際上取決於你在做什麼,爲什麼你這樣做。

+0

謝謝。我的意圖是阻止其中一個線程刪除這些調用A,B,C等使用的一些對象... – Manoj 2012-05-01 15:52:05