2017-03-25 112 views

回答

20

單一和重要的區別是std::scoped_lock有一個可變參數構造函數,它帶有多個互斥量。這允許以死鎖的方式鎖定多個互斥體,就好像使用了std::lock一樣。

{ 
    // safely locked as if using std::lock 
    std::scoped_lock<std::mutex, std::mutex> lock(mutex1, mutex2);  
} 

以前,你必須做一個小舞在使用std::lock一種安全的方式來鎖定多個互斥的解釋this answer

範圍鎖定的添加使其更易於使用並避免相關錯誤。您可以考慮使用std::lock_guardstd::scoped_lock的單個參數案例可以作爲專業化實施,因此您不必擔心可能的性能問題。

GCC 7已經支持std::scoped_lock可以看到here

欲瞭解更多信息,您可能需要閱讀的standard paper

+2

僅10分鐘後回答了您自己的問題。你真的不知道嗎? – Walter

+5

@Walter我做了https://stackoverflow.blog/2011/07/01/its-ok-to-ask-and-answer-your-own-questions/ – inf

+0

@Ruslan不確定你的意思。沒有10分鐘的延遲。當你創建一個問題時,你已經可以提供答案。 – inf

34

scoped_locklock_guard嚴格優越的版本鎖定互斥的一次性任意數量(使用相同的死鎖避免算法爲std::lock)。在新代碼中,您只能使用scoped_lock

lock_guard仍然存在的唯一原因是爲了兼容性。它不能被刪除,因爲它用在當前代碼中。此外,事實證明,改變其定義(從一元到多元)是不可取的,因爲這也是一種可觀察的,因此也是突破性的變化(但有些技術上的原因)。

+4

此外,感謝類模板參數推導,您甚至不必列出可鎖定類型。 –

+2

@NicolBolas:確實如此,但這也適用於'lock_guard'。但它確實使守護類更容易使用。 –

相關問題