2016-11-15 187 views
0

我需要鎖定一個std :: map和兩個boost :: multimaps函數內的操作,因爲我們有線程試圖訪問該函數(以及因此映射)。什麼更好std :: lock_guard <std::mutex>鎖(std :: mutex mutex_var);或std :: mutex mutex_var.lock();

我打算使用「std :: mutex mutex_var」來保護那些操縱它們的函數內部的變量。所以我有「std :: mutex mutex_var」變量。我在函數開頭使用「mutex_var.lock()」和函數結尾使用「mutex_var.unlock()」時感到困惑,只是在函數的開始處使用std :: lock_guard?

爲了清楚起見,所有函數都在互斥體上添加了一些東西。我也明白/我們不需要保護我們試圖查詢地圖的所有地方(因爲它只是一個讀取操作)。

請讓我知道更好的選擇,也請澄清,如果我的閱讀思路不需要保護是正確的。

TIA

-R

+0

您應該一次提出一個問題。 – Slava

+3

如果在鎖定互斥鎖時引發異常,會發生什麼情況? –

+0

mutex.lock()可能是一個問題,但我認爲std :: lock_guard(mutex_var)會沒問題,因爲棧幀會消失,從而使lock_guard失去範圍,從而釋放鎖定。如果我錯了,請糾正我。 – codeworks

回答

0
  • 通過簡單的互斥體,如果所有的線程正在讀取線程,你並不需要鎖定資源。但是,如果寫入追索權的線索中有一個或多個線索,則需要鎖定所有線索,甚至是讀取線索。
  • 有一種方法可以避免鎖定資源,當沒有寫入線程並鎖定資源時,當它是一個寫入線程。你需要使用更復雜的鎖定機制,你應該閱讀openforread和openforwrite邏輯。
相關問題