2016-02-27 117 views
1

我正在學習互斥鎖,我發現,要使用鎖守衛,每次迭代都必須爲鎖守分配內存,調用構造函數,然後調用析構函數。看起來這可能是一個相當大的開銷,與永遠不會超出範圍的鎖相比。我瞭解鎖警衛的優勢,但我可以通過避免他們多少時間來拯救?或者換句話說,線程每次迭代的工作量必須有多少才能使鎖控制開銷顯着?boost :: lock_guard分配,構造函數和析構函數開銷

prepare_data(); 
{ 
    boost::lock_guard<boost::mutex> lock(mut); 
    data_ready=true; 
} 
cond.notify_one(); 

回答

3

不需要分配。編譯器可以精確地查看構造函數和析構函數的作用,並優化對任何對象的內存分配或初始化的需求,或者需要調用特定的構造函數或析構函數。

它可以看到,構造函數除了調用互斥鎖的鎖定函數外什麼也不做,只是調用解鎖函數。 lock_guard的地址從未被採用,所以不需要一個。

這是在C++中推薦RAII的關鍵原因之一 - 它通常沒有任何成本。

0

編譯器很可能必須在堆棧上分配空間來存儲對於lock_guard析構函數的互斥量的引用。它不可能緩存它,因爲(a)鎖定/解鎖互斥體是外部函數調用,(b)這些函數強加內存隔離。但鎖定/解鎖互斥鎖的成本比與其相關的其他操作要大得多,因此沒有實際的理由來避免它。此外,現代編譯器在堆棧管理方面具有非常高效的技術,並且爲參考分配空間可能實際上是空操作。

相關問題